向IDP发送身份验证请求时如何发送当前URL作为中继状态

时间:2019-04-30 06:35:15

标签: java spring single-sign-on saml spring-saml

在为我们的一个应用程序实施基于SAML的身份验证时,我遇到了一项要求,在此要求下,我们需要在通过IdP(身份提供程序)进行身份验证后恢复用户的会话。考虑以下情形-

  1. 用户尝试打开第1页
  2. 由于第1页需要身份验证,我们将用户重定向到IDP
  3. IDP对用户进行身份验证并将其重定向回SP(服务提供商)。

不幸的是,在身份验证之后,用户最终出现在默认主页上而不是页面1上。根据文档,我们可以使用relayState将信息从SP中继到IdP(在身份验证请求期间)并从IdP返回到SP。

看起来WebSSOProfileOptions允许我们指定relayState的值,但是在这种情况下,该值将不是固定的或静态的。

我们如何将当前页面的URL传递到中继状态,以便我们可以在身份验证后恢复原样并将用户重定向回同一页面?

1 个答案:

答案 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}的回答所示}。