我开始使用基于服务提供商的SSO进行SAML。由于用户必须在继续登录之前输入他的电子邮件,因此启动了状态变量并将其传递给SSO。它通过回调URL返回,因此再次检查是否有理由。它可以防止CSRF攻击。
现在IdP发起的SSO根本不允许我设置状态变量。登录从身份提供程序开始,只向应用程序提供身份验证令牌。我不知道哪个用户从一开始就进行身份验证。如果我删除状态变量检查,它也可能触发CSRF攻击。
我还在omniauth
中使用rails
,这使得状态变量成为强制参数,而SSO提供程序为auth0
。
将状态变量附加到IdP启动的SSO解决方案的方法是什么?
答案 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