【问题标题】:SAMLException: InResponseToField of the Response doesn't correspond to sent messageSAMLException:响应的 InResponseToField 与发送的消息不对应
【发布时间】:2017-12-25 16:31:00
【问题描述】:

我们正在开发一个应用程序,该应用程序受 spring security saml 保护。

身份验证工作正常,但生产环境中的以下工作流程存在一个问题。

  1. 用户请求未受保护的地址 www.server.com
  2. response 是一个带有内联脚本的 html 页面,该脚本将 window.location.href 更改为受 saml 保护的页面(服务提供商)www.server.com/app/action?param1=value1&param2=value2
  3. spring saml 检测到需要身份验证并将用户重定向到 www.login-server.com 上的登录表单(身份提供程序)
  4. 此时登录表单是显示给用户的第一页
  5. 用户将此登录页面添加为书签(包括此 http 会话的 saml 相关 url 参数)www.login-server.com/adfs/ls/?SAMLRequest=xxx&SigAlg=xxx&Signature=arGdsZwJtHzTDjQP1oYqbjNO
  6. 用户使用应用程序...
  7. 第二天用户打开此书签并登录
  8. IdP 重定向到 SP,但所属的 http 会话已过期

现在我们的应用程序中出现以下异常:

org.opensaml.common.SAMLException:响应的 InResponseToField 与发送的消息不对应 arGdsZwJtHzTDjQP1oYqbjNO

任何想法如何处理此工作流程以便用户在成功登录后可以使用该应用程序? 感谢您的回答!

【问题讨论】:

    标签: spring security spring-security saml spring-saml


    【解决方案1】:

    我们已经通过对 spring saml 配置的以下更改解决了我们的问题:

    1. 在 ID 为 successRedirectHandler (org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler) 的 bean 中,我们将 defaultTargetUrl 设置为我们应用程序的 init-Action(包括所有请求参数)。在 IdP 发起 SSO 的情况下,将自动使用此 URL。
    2. 在 ID 为 contextProvider (org.springframework.security.saml.context.SAMLContextProviderLB) 的 Bean 中,我们将 storageFactory 设置为 org.springframework.security.saml.storage.EmptyStorageFactory。这会禁用 InResponseToField 的检查。

    【讨论】:

    • 您的应用程序的init-Action 是什么?
    • 我们的初始化动作类似于/index.do?lang=de&paramX=Y。它是完全静态的,这就是我们的解决方案真正有效的原因。
    • 为什么要禁用对 InResponseToField 的检查,除非它纯粹是在开发中调试?
    • EmptyStorageFactory 真的很有帮助。谢谢
    【解决方案2】:

    当您应用程序生成 AuthnRequest 时,该请求具有您的应用程序以某种方式保留的 ID。来自 IdP 的相应响应必须将 InResponseTo 属性设置为相同的 ID 值,以便您的应用程序可以验证响应是否适用于它发送的请求。

    但是,当您的用户将包含请求的 adfs 链接添加为书签时 (www.login-server.com/adfs/ls/?SAMLRequest=xxx...),您的应用程序完全忘记了该请求。换句话说,它不再将请求 ID 保存在某处,也无法验证响应。

    解决方案是告诉您的用户不要为 www.login-server.com/adfs/ls/?SAMLRequest=xxx... 链接添加书签。相反,他们必须在您的应用程序中为一个链接添加书签,以便它可以生成新请求并发送到 ADFS。

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2018-02-28
      • 2019-11-25
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2021-07-24
      • 2012-12-18
      相关资源
      最近更新 更多