通过后台通道使用 HTTP-POST 单点注销

Single Logout using HTTP-POST via back channel

Keycloak、WSO2 和其他一些 SSO IDP 服务器提供了 "Single Logout" 的可能性,而不强制浏览器通过 HTTP 发送 <LogoutRequest> 重定向到当前用户登录的每个 SP-POST 通过后台渠道。

不幸的是,如果服务中的 SSO 集成是使用 spring-security-saml2-core 库(我们正在使用 Keycloack)实现的,这将不起作用。

我能从 SP 端的日志文件中找出的是:

[2016-01-13 12:50:56.867] [DEBUG] [org.springframework.security.saml.SAMLLogoutProcessingFilter] - Received logout request is invalid, responding with error
org.springframework.security.saml.SAMLStatusException: No user is logged in
    at org.springframework.security.saml.websso.SingleLogoutProfileImpl.processLogoutRequest(SingleLogoutProfileImpl.java:168)
    at org.springframework.security.saml.SAMLLogoutProcessingFilter.processLogout(SAMLLogoutProcessingFilter.java:176)
    at org.springframework.security.saml.SAMLLogoutProcessingFilter.doFilter(SAMLLogoutProcessingFilter.java:102)

...

使用 Spring SAML 扩展的应用程序部署在 Tomcat 7 上。似乎 <LogoutRequest> 通过后端通道发送时没有浏览器会话 cookie,并且无法识别用户应用会话,所以用户无法注销,用户的应用会话不会失效。

然而<LogoutRequest>包含可以唯一标识应用程序会话的全局SSO会话标识符。但这并没有发生。

Spring SAML 库的这种行为是否有意设计:在单点注销期间不支持后端通信?还是我遗漏了什么并且可以配置所需的行为?

注意:我知道根据 SAML 规范 HTTP-POST 和 HTTP-Redirect 绑定旨在通过用户代理(Web 浏览器)承载,但是 SSO IDP 服务器的广泛支持让我提出这个问题问题:)

提前致谢!

更新: 根据 Vladimir Schäfer 在 SES-162 ticket 中的评论,这似乎是一种有意的图书馆行为。

在 Spring-SAML 中,单点注销目前支持 HTTP 重定向和 HTTP-POST 绑定。 SOAP 绑定不可用。参考:Spring SAML Global Logout

spring-saml

不支持反向通道

,无法使用 Spring-SAML 库通过反向通道通过 HTTP-POST 执行 <LogoutRequest>

此行为违反 SAML 规范,根据 Vladimir Schäfer 在 SES-162 ticket 中的评论,Spring-SAML 不支持此行为。

SOAP 绑定适用于后端通道,但正如@meetarun 所指出的那样,目前它尚未在 Spring-SAML 库中实现。