如何在身份提供者 (IdP) 发起的 SAML sso 中维护状态参数?
Posted
技术标签:
【中文标题】如何在身份提供者 (IdP) 发起的 SAML sso 中维护状态参数?【英文标题】:How to maintain state parameter in Identity Provider (IdP) initiated SAML sso? 【发布时间】:2017-10-07 06:18:34 【问题描述】:我从 SAML 的基于服务提供商的 SSO 开始。由于用户在继续登录之前必须输入他的电子邮件,因此会启动一个状态变量并将其传递给 SSO。它通过回调 URL 返回,因此出于健全目的再次检查。它可以防止 CSRF 攻击。
现在 IdP 发起的 SSO 根本不允许我设置状态变量。登录从身份提供者开始,并且只向应用程序提供一个身份验证令牌。我不知道哪个用户从一开始就在进行身份验证。如果我删除状态变量检查,它也可能触发 CSRF 攻击。
我还在rails
中使用omniauth
,这使得状态变量成为强制参数,SSO 提供者是auth0
。
将状态变量附加到 IdP 发起的 SSO 解决方案的方法是什么?
【问题讨论】:
【参考方案1】:IDP-init-SSO SAML 流中RelayState
参数的事实上的标准值是您希望在 SP 处成功验证 SAML 断言后将用户发送到的 URL。这适用于绝大多数 SAML 部署。
然而,该机制确实不能防止 CSRF 攻击,这就是为什么规范对 IDP-init-SSO 中 RelayState
的值保持沉默,并允许就 IDP 和 SP 之间的机制达成一致,以防止 CSRF 通过该参数的值。一种这样的机制是在RelayState
中使用签名值,但如上所述,没有任何东西是标准化的,因此它取决于 IDP 和 SP 之间的双边协议,该协议无法扩展。
总而言之:将您希望用户转到的 URL 的值作为 RelayState
值在您发送给 SP 的“未经请求的”SAML 响应中发送。如何让 IDP 的 SAML 堆栈执行此操作是特定于实现的。对于 Auth0,您可以在以下位置阅读:https://auth0.com/docs/protocols/saml/saml-configuration#idp-initiated-sso,在您的情况下,它看起来像:
https://accountname.auth0.com/samlp/YOUR_CLIENT_ID?RelayState=http://FINAL_DESTINATION_URL
【讨论】:
以上是关于如何在身份提供者 (IdP) 发起的 SAML sso 中维护状态参数?的主要内容,如果未能解决你的问题,请参考以下文章
Spring security SAML IDP 发起的 SSO