如何在身份提供者 (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

Cognito缺乏IDP发起的SSO

我们是不是需要 IDP 发起的 SSO (SAML) 中的 Keystore/JKSKeyManager?

强制 IDP 要求提供凭据

我如何才能完全信任 SAML IDP?

在 SP 回调中确定是 IDP 发起还是 SP 发起?