在为我们的一个应用程序实施基于SAML的身份验证时,我遇到了一项要求,在此要求下,我们需要在通过IdP(身份提供程序)进行身份验证后恢复用户的会话。考虑以下情形-
不幸的是,在身份验证之后,用户最终出现在默认主页上而不是页面1上。根据文档,我们可以使用relayState
将信息从SP中继到IdP(在身份验证请求期间)并从IdP返回到SP。
看起来WebSSOProfileOptions
允许我们指定relayState
的值,但是在这种情况下,该值将不是固定的或静态的。
我们如何将当前页面的URL传递到中继状态,以便我们可以在身份验证后恢复原样并将用户重定向回同一页面?
答案 0 :(得分:0)
解决方案:
Class WebSSOProfileOptions的官方链接演示了在relayState变量中发送自定义值的函数,即void setRelayState(String relayState)。
将身份验证请求发送到IDP时发送当前URL作为中继状态的编码示例
@Bean
public SAMLEntryPoint samlEntryPoint() {
SAMLEntryPoint entryPoint = new SAMLEntryPoint();
entryPoint.setDefaultProfileOptions(defaultWebSSOProfileOptions());
return entryPoint;
}
@Bean
public WebSSOProfileOptions defaultWebSSOProfileOptions() {
WebSSOProfileOptions options = new WebSSOProfileOptions();
options .setBinding("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
options.setRelayState(current-SP-URL);
return options;
}
备注:
(1)引用您的帖子“ WebSSOProfileOptions似乎允许我们指定relayState值,但是在这种情况下,该值将不是固定的或静态的。”
响应:
是。对Why SP-initiated SSO has RelayState as random opaque value的回答声称,SP发起的SSO中的RelayState通常不是URL。取而代之的是,它是一个不透明的字符串,被IDP回显。
这意味着“ 该值将不会是固定的或静态的”。
(2)引用您的问题“我们如何将当前页面的URL传递到中继状态,以便我们在身份验证后可以找回原样并将用户重定向到同一页面?” < / p>
答案:
对Why SP-initiated SSO has RelayState as random opaque value的回答声称,基于规范的上述描述,RelayState只是服务提供者将用来查找最终TARGET(URL)的指针。如果SP使用RelayState将URL发送到IDP,则会破坏安全模型。
这意味着我们不能“将当前页面的URL传递给RelayState” ,否则,它将破坏SAML建立的安全模型。
这就是为什么Spring SAML要求由 SP发起的SSO 生成的RelayState值不会固定或静态的原因,即“ 身份验证后,用户最终到达默认主页而不是第1页。”。
(3)其他信息
(I)对于由SP启动的SSO,RelayState值应为不透明的字符串。
(II)对于由IdP发起的SSO,relayState值可以为 SP应重定向到的URL 。这是用于RelayState的事实上的标准,正如另一个StackOveflow问题“ What is exactly RelayState parameter used in SSO (Ex. SAML)?”的答案所证明的。
(III)您不能“在将身份验证请求发送到IDP时发送当前URL作为中继状态” ,否则,它将破坏SAML建立的安全模型,如对{{3}的回答所示}。