Google App Engine 上的 Springboot SAML 集成失败,InResponseToField 与发送的消息不对应

Springboot SAML integration fails on Google App Engine, InResponseToField doesn't correspond to sent message

我已经为我的组织创建了一个 Springboot Restful 应用程序。 我有一个要求,

  1. 使用 IdP (ADFS2.0) 实施 SAML/SSO,
  2. 在 Google 的 App Engine (GAE) 上部署应用程序。

我已成功在 GAE(使用 SAML)上部署 Springboot 应用程序。

而且我已经在本地主机上使用模拟版本的 IdP(类似于 SSO-Circle)测试了 SAML/SSO,它运行顺利。

但是,当我在 GAE 上部署应用程序时(使用 IdP 的模拟版本或 IdP 的 QA 版本),我开始获得

InResponseToField doesn't correspond to sent message

,我确实在 Spring 文档 here.

中找到了解决方法

但是, 我无法理解,即使在经过大量调试之后,为什么我首先会收到该错误(尽管我稍后会在应用修复程序后收到不同的错误,我将在稍后进一步描述)。

很多令人困惑的部分是当我查看 App Engine 日志时,我发现,

  1. 在进行 /saml/login 调用时,日志跟踪显示

HttpSessionStorage : Storing message a3bbxxxx6c17 to session BXtxxxx1CCw

  1. 然后当 IdP 重定向回端点 /saml/SSO 上的应用程序时,日志会抛出错误,

HttpSessionStorage : Message a3bbxxxx6c17 not found in session BXtxxxx1CCw

以及异常

SAMLException: InResponseToField of the Response doesn't correspond to sent message a3bbxxxx6c17

  1. 我还交叉验证了从应用程序发出到 IdP 的 SAML 请求 (XML) 和从 IdP 返回到应用程序的 SAML 响应 (XML) 以及它们两者收到 a3bbxxxx6c17 消息。 那么,为什么 Springboot 在 GAE 上混淆而在本地主机上工作正常。

此外,当我按照 spring 文档所说 "checking of the InResponseToField can be disabled by re-configuring the context provider" 执行操作时,我注意到发生了循环,即

  1. /saml/login -> 2. /saml/SSO -> /landing -> 3. /saml/SSO -> /landing -> 4. /saml/SSO -> /landing - > 5. /saml/SSO -> /landing .... 依此类推,直到 IdP 拒绝请求,说在短时间内请求太多。

我也不明白为什么会这样,但我的假设是这可能是由于上述问题造成的。 有什么想法吗?

通过添加额外的配置解决了这个问题。

发生这种情况的事实是 Spring 不知道 App Engine (GAE) 上的会话,我们需要做的就是告诉 spring 这件事。

    @Configuration
        @EnableWebSecurity
        //Needed for Spring to know about the HttpSession
        @EnableSpringHttpSession
        @EnableGlobalMethodSecurity(securedEnabled = true)
        public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    //And this bean
        @Bean
        public MapSessionRepository sessionRepository() {
            return new MapSessionRepository();
        }
   // all other configurations
        }