SAMLException:响应的 InResponseToField 与发送的消息不对应

Ogo*_*god 10 security spring spring-security saml spring-saml

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

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

  1. 用户请求不受保护的地址 www.server.com
  2. 响应是一个带有内联脚本的 html 页面,该脚本将 window.location.href 更改为受 saml 保护的页面(服务提供商) www.server.com/app/action?param1=value1¶m2=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 不对应

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

Ogo*_*god 18

我们通过对 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 的检查。

  • 为什么要禁用对 InResponseToField 的检查,除非纯粹是在开发中进行调试? (3认同)

Thu*_*uan 7

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

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

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