如何使用spring-security-saml在多租户SAML应用程序中使用Global Logout?

时间:2016-08-26 21:22:16

标签: spring-security spring-saml

我正在使用的多租户SAML应用程序使用spring-security-saml,包含两个服务提供程序和一个IDP(Active Directory联合身份验证服务)。将SSO用于此应用程序的开发人员选择将其作为多租户,因为它是一个具有两个不同接口的双用途应用程序 - 基本上是两个应用程序。它被设计为在打开两个选项卡的浏览器中使用,因此一个界面在第一个选项卡中运行,另一个界面在第二个选项卡中运行。除了一个特定的工作流程外,一切似乎都正常工作:

  1. 打开浏览器,导航到ADFS登录页面,然后使用第一个服务提供商登录该应用程序
  2. 打开另一个标签,导航到ADFS登录页面,然后选择第二个服务提供商
  3. 执行全局注销
  4. 日志文件包含如下错误:

    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尝试使用相同的会话注销时,它会失败,因为会话已经消失。有人可以帮我解决这个问题吗?

1 个答案:

答案 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; }