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

时间:2017-07-20 06:31:25

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

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

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

  1. 用户请求不受保护的地址www.server.com
  2. 响应是一个带有内联脚本的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会话已经过期
  9. 现在我们在应用程序中遇到以下异常:

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

    不对应

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

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