如何在Identity Provider(IdP)中维护状态参数启动SAML sso?

时间:2017-05-09 04:45:50

标签: single-sign-on omniauth saml saml-2.0 auth0

我开始使用基于服务提供商的SSO进行SAML。由于用户必须在继续登录之前输入他的电子邮件,因此启动了状态变量并将其传递给SSO。它通过回调URL返回,因此再次检查是否有理由。它可以防止CSRF攻击。

现在IdP发起的SSO根本不允许我设置状态变量。登录从身份提供程序开始,只向应用程序提供身份验证令牌。我不知道哪个用户从一开始就进行身份验证。如果我删除状态变量检查,它也可能触发CSRF攻击。

我还在omniauth中使用rails,这使得状态变量成为强制参数,而SSO提供程序为auth0

将状态变量附加到IdP启动的SSO解决方案的方法是什么?

1 个答案:

答案 0 :(得分:4)

IDP-init-SSO SAML流中RelayState参数的事实标准值是您在SP上成功验证SAML断言后要将用户发送到的URL。这适用于绝大多数SAML部署。

然而,该机制确实无法抵御CSRF攻击,这就是为什么规范对IDP-init-SSO中RelayState的价值保持沉默的原因,并允许它同意IDP和SP之间的机制以防止CSRF通过该参数的值。其中一种机制是使用RelayState中的有符号值,但如上所述,没有任何标准化,因此它将取决于IDP和SP之间不能扩展的双边协议。

总结:发送您希望用户转到的网址的值作为"未经请求的"中的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

相关问题