【问题标题】:How to send current URL as relay state while sending authentication request to IDP如何在向 IDP 发送身份验证请求时将当前 URL 作为中继状态发送
【发布时间】:2019-09-18 18:37:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    分辨率
    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 的回答所示。

    【讨论】:

    • 这里的问题是WebSSOProfileOptions允许我们指定一个固定的RelayState。我对具有不是 URL 的值的 relayState 变量很好。如何在relayState 变量中发送自定义值? stackoverflow.com/questions/34350160/… 还声明 - '看起来即使在 SP 启动的登录上,谷歌也在使用 RelayState 作为目标 URL,这非常好。但是,正如文档所述,IDP 应该将其转发回去。这正是我想要实现的目标。
    • Spring SAML文档docs.spring.io/spring-security-saml/docs/current/api/org/…的官方链接演示了在relayState变量中发送自定义值的函数,即void setRelayState(String relayState)。例如,WebSSOProfileOptions options = new WebSSOProfileOptions(); options.setRelayState(current-SP-URL);请参阅上述修订答案的更多详细信息。
    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 2017-10-31
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多