Spring SAML SSO 不共享会话

Posted

技术标签:

【中文标题】Spring SAML SSO 不共享会话【英文标题】:Spring SAML SSO do not share session 【发布时间】:2017-05-14 16:15:36 【问题描述】:

我已将 WSO2 身份服务器配置为 IDP,并将两个应用程序配置为 SP。一切正常,除了几件事:

当我从一个应用程序注销时,另一个应用程序看不到我已注销

当我登录一个应用程序时,另一个应用程序看不到我已登录

恕我直言,有 SSO 和 SLO 的主要原则。

当我检查SecurityContextHolder.getContext().getAuthentication() 时,注销或登录另一个应用程序后没有任何变化。

也许我应该在每个加载 URL 之前调用 WSO2 页面 /samlsso?

我能做错什么?如何从另一个应用程序中检索该用户已注销/登录?

编辑:

例如,WSO2 API Manager Store 有这样的机制:

当我从我的应用程序注销并重新加载商店页面时,然后重定向到商店中未登录的主页面。与登录相同。

更新:

我在org.springframework.security.saml.websso.SingleLogoutProfileImpl 课堂上发现了问题。当注销请求来自 WSO2 IS 时,对象 AuthenticationSAMLCredential 为空,并发生错误 No user is logged in,但真实用户仍登录 Spring SAML 应用程序。

同样的讨论是here,但没有效果:\

【问题讨论】:

【参考方案1】:

您必须验证两个应用程序是否使用相同的主机名调用 Identity Server (IS)。例如。 https://is.blahblah.com/samlsso。

IS 会话基于 cookie(具体来说是“commonAuthId”和“samlssoTokenId”cookie)。如果应用程序使用两个不同的主机名调用 IS,则会在 IS 端创建两个不同的会话。要使 SSO 和 SLO 发生,两个应用程序必须共享一个 IS 会话。

【讨论】:

【参考方案2】:

我们正在使用 travelocity.com 和 avis.com 网络应用程序来测试 SAML2 sso。您可以在此处找到更多详细信息[1]。此外,您可以查看此文档[2] 在身份服务器中注册两个服务提供者并按照 1 到 8 步操作。

[1]https://docs.wso2.com/display/IS500/Configuring+Single+Sign-On+with+SAML+2.0

[2]https://docs.wso2.com/display/IS500/Customizing+Login+Pages

【讨论】:

以上是关于Spring SAML SSO 不共享会话的主要内容,如果未能解决你的问题,请参考以下文章

SAML 重新验证用户会话

带有 Spring 会话的 Spring Security SAML

使用带有 Spring Security 的 SAML 进行单点登录 (SSO)

OpenID Connect 最终会取代 SAML 成为 SSO 的主导协议吗?

Spring security SAML IDP 发起的 SSO

配置 ADFS 3.0 / SAML 2.0 以使用 Spring Security 进行 SSO 集成