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

Posted

技术标签:

【中文标题】如何正确地将 RelayState 传递给 Okta 的 ACS URL?【英文标题】:How do I hand RelayState correctly to Okta's ACS URLs? 【发布时间】:2017-04-25 13:25:33 【问题描述】:

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

Okta 为身份提供者提供的 ACS URL 没有像我预期的那样处理 SP 发起的 RelayState。

我将 ?RelayState=hello 放在 ACS URL 上,IdP 得到一个 SAMLRequest,其 RelayState 为 %3FRelayState%3Dhello,解码为 ?RelayState=hello

如果我输入?RelayState=,那么带有 SAMLRequest 的 RelayState 就像我预期的那样是空白的。

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

https://fs.research.verafin.local/adfs/ls 上的 AD FS 的 IdP SSO 服务对 RelayState 进行解码和重新编码,保留其提供的损坏值,并将其放入要发布到 https://verafin.oktapreview.com:443/sso/saml2/0oaa25fc86YRTkyb60h7(Okta ACS URL)的表单中。

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

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

如何让 Okta ACS URL 接受 GET 请求中的 RelayState(SP 使用 RelayState 发起 SSO)?

复制步骤

    从 Okta 中的身份提供程序复制 ACS URL 将其粘贴到浏览器中,后面加上?RelayState=hello 访问生成的 URL

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

【问题讨论】:

【参考方案1】:

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

使用 SAML 深层链接重定向

使用 SAML 深层链接自动将用户重定向到应用 成功通过第三方 IdP 进行身份验证。要使用深层链接, 将这三个部分组合成一个 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

以上三部分的深层链接为: https://myOktaDomain.com/sso/saml2/:idpId/app/:app-location/:appId/sso/saml?RelayState=:anyUrlEncodedValue

【讨论】:

这是一个巨大的改进。谢谢你分享这个。【参考方案2】:

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

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

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

/home/admin-entry

URL 编码(RelayState 所需的)即:

%2Fhome%2Fadmin-entry

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

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

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

您创建一个链接到该身份提供程序的应用程序,称为环回。它有一个单点登录 URL(单击登录选项卡上的查看设置说明后可见):

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

RelayState 有两层:

    您希望 Okta 将您引导至的应用程序:在本例中为环回应用程序 该应用程序中的路径

将 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

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

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 中介到另一个应用程序。

【讨论】:

以上是关于如何正确地将 RelayState 传递给 Okta 的 ACS URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将 C 数组传递给 C#?

如何正确地将页面属性传递给局部视图?

在 C# 中如何正确地将 int 数组传递给函数

如何正确地将 numpy 数组传递给 Cython 函数?

如何正确地将变量传递给 apollo useQuery?

如何正确地将单击按钮属性值传递给表单提交事件?