SAML异常:响应的InResponseToField与发送的消息不对应。

13

我们正在开发一款应用程序,该程序受到Spring Security 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会话已经过期

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

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

有什么想法可以处理这个工作流程,以便用户在成功登录后可以使用该应用程序? 感谢您的回答!

2个回答

21

我们通过以下更改 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 的检查。

你的应用程序中的 init-Action 是什么? - Koray Tugay
我们的初始化操作类似于/index.do?lang=de&paramX=Y。它完全是静态的,这就是为什么我们的解决方案实际上能够正常工作的原因。 - Ogod
3
除非这是开发阶段纯粹的调试,否则为什么要禁用InResponseToField的检查? - homaxto
1
"EmptyStorageFactory"真的很有用。 - Howard

7
当您生成一个AuthnRequest时,请求将具有一个ID,您的应用程序以某种方式保留该ID。IdP相应的响应必须将InResponseTo属性设置为相同的ID值,以便您的应用程序可以验证该响应是针对其发送的请求的。
然而,当您的用户收藏包含请求的adfs链接(www.login-server.com/adfs/ls/?SAMLRequest=xxx...)时,您的应用程序已完全忘记了该请求。换句话说,它不再保留请求ID,并且不能验证响应。
解决方案是告诉您的用户不要收藏www.login-server.com/adfs/ls/?SAMLRequest=xxx...链接。相反,他们必须在您的应用程序中收藏一个链接,在该链接处可以生成新的请求并发送给ADFS。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接