如何将 RelayState 正确传递给 Okta 的 ACS URL?

How do I hand RelayState correctly to Okta's ACS URLs?

我如何将 RelayState 正确地传递给 Okta 端 ACS URLs,以便它按照输入的方式到达 IdP?

Okta 为身份提供者提供的 ACS URLs 没有像我预期的那样处理 SP 启动的 RelayState。

我将 ?RelayState=hello 放在 ACS URL 上,IdP 收到 RelayState 为 %3FRelayState%3Dhello 的 SAMLRequest,解码为 ?RelayState=hello

如果我改用 ?RelayState=,那么带有 SAMLRequest 的 RelayState 如我所料是空白的。

我附上了 NetworkData.xml,这是从 Internet Explorer 捕获的。在第447行第53列,可以看到Okta编码的要POST到https://fs.research.verafin.local/adfs/ls的RelayState中包含了?RelayState

位于 https://fs.research.verafin.local/adfs/ls 的 AD FS 的 IdP SSO 服务对 RelayState 进行解码和重新编码,保留给定的损坏值并将其放入要发布到 https://[ 的表单中=54=]:443/sso/saml2/0oaa25fc86YRTkyb60h7 (Okta ACS URL).

然后重定向到 https://verafin.oktapreview.com/?RelayState=hello&fromLogin=true HTTP/1.1

这是 Okta 的 ACS 实施中的错误吗?

如何让 Okta ACS URLs 接受 GET 请求中的 RelayState(SP 使用 RelayState 启动 SSO)?

重现步骤

  1. 从 Okta 中的身份提供者复制 ACS URL
  2. 将其粘贴到浏览器中,并在其后添加 ?RelayState=hello
  3. 访问结果 URL

我如何将 RelayState 正确地传递给 Okta 端 ACS URLs,以便它按照输入的方式到达 IdP?

您可以使用 fromURI 作为查询参数,稍作调整。

Okta 组织中的环回是一个具有最小依赖性的示例。

假设您想进入某个组织的管理界面。它位于:

/home/admin-entry

URL 编码(RelayState 所需要的)即:

%2Fhome%2Fadmin-entry

您可以通过查看 /app/UserHome 页面上管理员 link 的 URL 来验证这一点。

您在 Okta 中创建了一个名为 loopback 的身份提供者。我的示例的 ACS URL 为:

https://dev-971545.oktapreview.com/auth/saml20/loopback

您创建了一个 linked 到名为环回的身份提供者的应用程序。它的单点登录 URL(单击“登录”选项卡上的“查看设置说明”后可见)为:

https://dev-971545.oktapreview.com/app/independentconsultantdev927755_loopback_1/exkadbfail8okn4W80h7/sso/saml

RelayState有两层:

  1. 您希望 Okta 将您引导至的应用:在本例中为环回应用
  2. 该应用内的路径

将 RelayState 传递给应用程序 SSO URL 很简单:

https://dev-971545.oktapreview.com/app/independentconsultantdev927755_loopback_1/exkadbfail8okn4W80h7/sso/saml?RelayState=%2Fhome%2Fadmin-entry

之后 URL 将我带到管理仪表板。

还没有入站 SAML。这一切都在 Okta 中。让我们添加 SAML 层。

该应用 SSO URL 的路径减去前导斜杠(fromURI 的解决方法)是:

app/independentconsultantdev927755_loopback_1/exkadbfail8okn4W80h7/sso/saml?RelayState=%2Fhome%2Fadmin-entry

我们URL对其进行编码,使其成为查询参数的值:

app%2Findependentconsultantdev927755_loopback_1%2Fexkadbfail8okn4W80h7%2Fsso%2Fsaml%3FRelayState%3D%252Fhome%252Fadmin-entry

然后您将这种疯狂作为 fromURI 查询参数丢弃在环回身份提供者的 ACS 上:

https://dev-971545.oktapreview.com/auth/saml20/loopback?fromURI=app%2Findependentconsultantdev927755_loopback_1%2Fexkadbfail8okn4W80h7%2Fsso%2Fsaml%3FRelayState%3D%252Fhome%252Fadmin-entry

您可以说服自己成功了,或者您可以打开浏览器开发人员工具的“网络”选项卡并跟踪通信。 ACS 在斜杠前放置一个 RelayState(这就是我们必须删除它的原因),然后被重定向到 IdP(环回应用程序),然后被反射回 ACS(保留 RelayState)。登录完成,Okta 使用查询参数中的 RelayState 重定向到环回应用程序 SSO URL。 Okta 处理并重定向到自身,然后重定向到嵌入式 RelayState,它将您带到管理仪表板。

这是从 Okta 的 SP 发起的流深度链接的工作示例,Okta 作为 SAML 中介到另一个应用程序。

已接受的答案不再是最新的,Okta 建议不要现在使用 fromURI,并建议使用定义的 SAML DeepLinks here

Redirect with SAML deep links

Use SAML deep links to automatically redirect the user to an app after successfully authenticating with a third-party IdP. To use deep links, assemble these three parts into a URL:

SP ACS URL
For example: https://{myOktaDomain}.com/sso/saml2/:idpId
The app to which the user is automatically redirected after successfully authenticating with the IdP
For example: /app/:app-location/:appId/sso/saml
Optionally, if the app is an outbound SAML app, you can specify the relayState passed to it.
For example: ?RelayState=:anyUrlEncodedValue

The deep link for the above three parts is: https://{myOktaDomain}.com/sso/saml2/:idpId/app/:app-location/:appId/sso/saml?RelayState=:anyUrlEncodedValue