我们正在开发一个受Spring spring saml保护的应用程序。
身份验证工作正常,但生产环境中的以下工作流程存在一个问题。
现在我们在应用程序中遇到以下异常:
org.opensaml.common.SAMLException:响应的InResponseToField与发送的消息arGdsZwJtHzTDjQP1oYqbjNO
不对应如何处理此工作流程以便用户在成功登录后可以使用该应用程序? 谢谢你的回答!
答案 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配置的以下更改解决了我们的问题:
successRedirectHandler
(org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler
)的bean中,我们将defaultTargetUrl设置为应用程序的init-Action(包括所有请求参数)。在IdP发起的SSO的情况下,将自动使用此URL。contextProvider
(org.springframework.security.saml.context.SAMLContextProviderLB
)的Bean中,我们将storageFactory设置为org.springframework.security.saml.storage.EmptyStorageFactory
。这将禁用InResponseToField的检查。