我正在使用的多租户SAML应用程序使用spring-security-saml,包含两个服务提供程序和一个IDP(Active Directory联合身份验证服务)。将SSO用于此应用程序的开发人员选择将其作为多租户,因为它是一个具有两个不同接口的双用途应用程序 - 基本上是两个应用程序。它被设计为在打开两个选项卡的浏览器中使用,因此一个界面在第一个选项卡中运行,另一个界面在第二个选项卡中运行。除了一个特定的工作流程外,一切似乎都正常工作:
日志文件包含如下错误:
Message a598hd6ff68479a44c3495f7h4216aa not found in session 11cfm6ja982te14dxxul71iufg
Received logout response is invalid
InResponseToField in LogoutResponse doesn't correspond to sent message a598hd6ff68479a44c3495f7h4216aa
我怀疑这与在标签之间共享相同的JSESSIONID cookie这一事实有关,因此当一个SP注销时,它会终止关联的会话。然后,当其他SP尝试使用相同的会话注销时,它会失败,因为会话已经消失。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我终于能够通过在SecurityContextLogoutHandler bean中将invalidateHttpSession设置为false来正确地工作。现在,当第一个服务提供程序注销时,身份验证仍会被清除,但会话仍然有效。然后,当第二个服务提供程序注销时,它会找到会话并成功注销。这应该没问题,因为Jetty默认会在30分钟不活动后超时。这是我改变的bean:
// Logout handler terminating local session
@Bean
public SecurityContextLogoutHandler logoutHandler() {
SecurityContextLogoutHandler logoutHandler =
new SecurityContextLogoutHandler();
logoutHandler.setInvalidateHttpSession(false);
logoutHandler.setClearAuthentication(true);
return logoutHandler;
}