如何正确地将 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?的主要内容,如果未能解决你的问题,请参考以下文章