Spring Engine SAML集成在Google App Engine上失败,InResponseToField与发送的消息

时间:2018-02-13 01:07:13

标签: google-app-engine spring-boot spring-saml

我为我的组织创建了一个Springboot Restful Application。 我有要求,

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

    我已经在localhost上使用Mock版本的IdP(类似于SSO-Circle)测试了SAML / SSO,它运行顺畅。

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

      

    InResponseToField与发送的消息

    不对应

    ,我确实在Spring docs here中找到了解决方法。

    但是,  我没理解,即使经过激烈的调试,为什么我首先得到了这个错误(虽然我在应用修复后会得到一个不同的错误,我将在后面进一步描述)。

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

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

      HttpSessionStorage:将消息a3bbxxxx6c17存储到   会话BXtxxxx1CCw

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

        HttpSessionStorage:找不到消息a3bbxxxx6c17   会话BXtxxxx1CCw

        以及例外

          

        SAMLException:响应的InResponseToField不对应   发送消息a3bbxxxx6c17

        1. 我还交叉验证了从应用程序发送到从IdP返回到应用程序的IdP和SAML响应(XML)的SAML请求(XML),它们都有a3bbxxxx6c17消息。 那么,为什么Springboot在GAE上混淆并且与localhost一起使用。
        2. 此外,当我执行spring文档所说的内容时,"可以通过重新配置上下文提供程序来禁用InResponseToField的检查",我注意到发生了循环,即

          1. / saml / login - > 2. / saml / SSO - > / landing - > 3. / saml / SSO - > / landing - > 4. / saml / SSO - > / landing - > 5. / saml / SSO - > /登陆....依此类推,直到IdP拒绝请求在一小部分时间内说太多请求。
          2. 我也不明白为什么会发生这种情况,但我的假设是这可能是由于上述问题。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

    @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
        }