Shibboleth SSO 和 Spring SP:由于“InResponseToField”不匹配错误而无法登录

Posted

技术标签:

【中文标题】Shibboleth SSO 和 Spring SP:由于“InResponseToField”不匹配错误而无法登录【英文标题】:Shibboleth SSO and Spring SP: Unable to login due to "InResponseToField" mismatch error 【发布时间】:2018-08-14 08:32:53 【问题描述】:

在我的生产设置中,负载均衡器后面有 2 个服务提供商和 2 个 IdP 实例,我在我的一个 SP 日志中看到以下错误,我不确定原因:

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

我正在使用 Shibboleth 3,Spring security 3.1.2 RELEASE 的服务提供商,Spring Security SAML 1.0.0。

我无法在生产环境中始终如一地重现此错误,因为它可能发生在用户单击链接并需要重新进行身份验证时或用户在登录屏幕上时。

到目前为止,我能够始终如一地重现的方法是在登录时点击提交之前删除服务提供者的 JSESSIONID(例如,通过转到 Chrome 控制台,然后从 cookie 列表中删除它)屏幕。

以下是在生产中发生此错误时其中一个 SP 的日志的 sn-p - 服务提供商在身份验证后创建不同的 JSessionID,类似于我上面描述的设置:

2018-03-05 06:33:38 DEBUG HttpSessionStorage:93 - Storing message a7a636i3hee345244e5j390hia90fg to session BC1B9DEC1CF797AA99FF3F8B4431D301

   2018-03-05 06:34:42 DEBUG HttpSessionStorage:117 - Message a7a636i3hee345244e5j390hia90fg not found in session FE9D2450284C49549E7AC212F1271045

   org.opensaml.common.SAMLException: InResponseToField of the Response doesn't correspond to sent message a7a636i3hee345244e5j390hia90fg
           at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:139)

安全问题的可能解决方案

一种可能的解决方案是禁用对服务提供者的某些请求验证检查。

此forum post 建议对SAML 存储使用EmptyStorageFactory 策略,并在SavedRequestAwareAuthenticationSuccessHandler bean 中使用defaultTargetURL

这个post 提到了这种解决方法的安全风险,其中存在重放攻击的可能性。我们的 SP 和 IdP 仅使用 HTTPS,因此这可能会得到缓解 - 是否存在可能引入的其他漏洞?

【问题讨论】:

【参考方案1】:

这可能是您的负载平衡器配置有问题。在您的用例中,在负载均衡器中配置粘性会话很重要。考虑一种情况,当 SP1 发出身份验证请求并且您的 LB 将响应重定向到 SP2 时,在这种情况下,SP2 将抛出您收到的此错误。如果您的 LB 将响应重定向到 SP1,登录会正常工作。这可能是随机情况,这就是为什么您无法始终如一地重现此错误的原因。尝试在您的 LB 中配置粘性会话。让我知道这是否有帮助。

【讨论】:

该设置有一个负载均衡器,粘性会话为 3 小时。此外,SP 会话只停留在一个 SP 上,因为我只能看到为该 SP 生成的日志。

以上是关于Shibboleth SSO 和 Spring SP:由于“InResponseToField”不匹配错误而无法登录的主要内容,如果未能解决你的问题,请参考以下文章

Shibboleth

带有移动客户端的 Saml SSO

使用 Shibboleth 的 asp.net MVC 身份验证

我是不是应该要求 IdP 签署 SAML2 SSO 响应?

Shibboleth SP 是 SAML 2.0 的实现吗?

为了实施 SAML,我是不是需要在主机上安装 Shibboleth SP?