Google App Engine 上的 Springboot SAML 集成失败,InResponseToField 与发送的消息不对应
Springboot SAML integration fails on Google App Engine, InResponseToField doesn't correspond to sent message
我已经为我的组织创建了一个 Springboot Restful 应用程序。
我有一个要求,
- 使用 IdP (ADFS2.0) 实施 SAML/SSO,
- 在 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 日志时,我发现,
- 在进行 /saml/login 调用时,日志跟踪显示
HttpSessionStorage : Storing message a3bbxxxx6c17 to
session BXtxxxx1CCw
- 然后当 IdP 重定向回端点 /saml/SSO 上的应用程序时,日志会抛出错误,
HttpSessionStorage : Message a3bbxxxx6c17 not found in
session BXtxxxx1CCw
以及异常
SAMLException: InResponseToField of the Response doesn't correspond to
sent message a3bbxxxx6c17
- 我还交叉验证了从应用程序发出到 IdP 的 SAML 请求 (XML) 和从 IdP 返回到应用程序的 SAML 响应 (XML) 以及它们两者收到 a3bbxxxx6c17 消息。
那么,为什么 Springboot 在 GAE 上混淆而在本地主机上工作正常。
此外,当我按照 spring 文档所说 "checking of the InResponseToField can be disabled by re-configuring the context provider" 执行操作时,我注意到发生了循环,即
- /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
}
我已经为我的组织创建了一个 Springboot Restful 应用程序。 我有一个要求,
- 使用 IdP (ADFS2.0) 实施 SAML/SSO,
- 在 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 日志时,我发现,
- 在进行 /saml/login 调用时,日志跟踪显示
HttpSessionStorage : Storing message a3bbxxxx6c17 to session BXtxxxx1CCw
- 然后当 IdP 重定向回端点 /saml/SSO 上的应用程序时,日志会抛出错误,
HttpSessionStorage : Message a3bbxxxx6c17 not found in session BXtxxxx1CCw
以及异常
SAMLException: InResponseToField of the Response doesn't correspond to sent message a3bbxxxx6c17
- 我还交叉验证了从应用程序发出到 IdP 的 SAML 请求 (XML) 和从 IdP 返回到应用程序的 SAML 响应 (XML) 以及它们两者收到 a3bbxxxx6c17 消息。 那么,为什么 Springboot 在 GAE 上混淆而在本地主机上工作正常。
此外,当我按照 spring 文档所说 "checking of the InResponseToField can be disabled by re-configuring the context provider" 执行操作时,我注意到发生了循环,即
- /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
}