在为我们的一个应用程序实施基于SAML的身份验证时,我遇到了一项要求,在此要求下,我们需要在通过IdP(身份提供程序)进行身份验证后恢复用户的会话。考虑以下情形-
不幸的是,在身份验证之后,用户最终到达的是默认主页,而不是页面1。根据文档,我们可以使用
relayState
将信息从SP中继到IdP(在身份验证请求期间),再从IdP中继到SP。看起来
WebSSOProfileOptions
允许我们指定relayState
值,但是在这种情况下,该值将不是固定的或静态的。我们如何将当前页面的URL传递到中继状态,以便我们可以在身份验证后恢复原样并将用户重定向回同一页面?
最佳答案
分辨率:
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传递给中继状态,以便我们在身份验证后可以找回原样并将用户重定向到同一页面?”
回答:
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建立的安全模型,如Why SP-initiated SSO has RelayState as random opaque value的答案所示。