首页 > 解决方案 > 如何在向 IDP 发送身份验证请求时将当前 URL 作为中继状态发送

问题描述

在为我们的一个应用程序实施基于 SAML 的身份验证时,我遇到了一个要求,即我们需要在 IdP(身份提供者)身份验证后恢复用户的会话。考虑以下场景 -

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

不幸的是,在身份验证后,用户最终进入默认主页而不是第 1 页。根据文档,我们可以使用relayState将信息从 SP 中继到 IdP(在身份验证请求期间),然后从 IdP 中继到 SP。

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

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

标签: javaspringsingle-sign-onsamlspring-saml

解决方案


解决方法: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值,但在这种情况下该值不会是固定的或静态的。”

回应
是的。为什么 SP 发起的 SSO 将 RelayState 作为随机不透明值的答案声称 SP 发起的 SSO 中的 RelayState 通常不是 URL。取而代之的是,它是一个不透明的字符串,由 IDP 回显。
这意味着“该值不会是固定的或静态的”。

(2)引用您的问题“我们如何将当前页面的 URL 传递给中继状态,以便我们可以在身份验证后返回相同并将用户重定向回同一页面?”

回答为什么 SP 发起的 SSO 将 RelayState 作为随机不透明值
的答案声称根据上述规范中的描述,RelayState 只是服务提供商用来找出最终目标(一个 URL)的指针。如果 SP 使用 RelayState 向 IDP 发送 URL,它会破坏安全模型。 这意味着我们不能“将当前页面的 URL 传递给 RelayState”,否则,它将破坏 SAML 建立的安全模型。这就是为什么 Spring SAML 要求由SP 发起的 SSO 生成的 RelayState 值不会是固定的或静态的,即“在身份验证后,用户最终会出现在默认主页而不是第 1 页。

”。

(3)其他信息
(I) 对于 SP 发起的 SSO,RelayState 值应该是一个不透明的字符串。
(II) 对于 IdP 发起的 SSO,relayState 值可以是SP 应该重定向到的 URL。这是用于 RelayState 的事实上的标准,正如对另一个 StackOveflow 问题“ SSO (Ex. SAML) 中使用的 RelayState 参数到底是什么? ”的回答所证明的那样。
(III) 您不能“在向 IDP 发送身份验证请求时将当前 URL 作为中继状态发送”,否则它将破坏 SAML 建立的安全模型,如为什么 SP-initiated SSO has RelayState as random opaque value的答案所示.


推荐阅读