Symfony Guard组件和无状态认证(Shibboleth)

Ger*_*sch 5 php session shibboleth single-sign-on symfony

我的应用程序需要使用名为Shibboleth的SSO服务.所以我使用了现有的shibboleth-bundle.事情发生了变化,我们需要为用户添加表单身份验证方法.所以我决定用新的Guard组件实现Shibboleth身份验证.(见ShibbolethGuardBundle)

我在开发过程中发现了一个问题.Symfony ShibbolethAuthenticator在第一个请求时调用方法,创建一个令牌,并且永远不会ShibbolethAuthenticator在以后的请求中调用任何方法.这意味着,如果Shibboleth会话结束,用户仍然使用Symfony会话进行身份验证.

如果要实现令牌身份验证,这也是一个问题.用户只需要在第一次请求时发送令牌.会话对任何其他请求进行身份验证.

其他SSO服务也存在此问题.如果您在Facebook注销,您希望在任何使用Facebook身份验证的网站上注销.但是如果你用Guard实现了这个,你在facebook注销后仍然有一个有效的会话.

我通过检查是否UserProvider在每个请求中设置了shibboleth头变量找到了一个快速的解决方案.如果它们丢失,则会调用异常并ExceptionListener重定向到登录页面.

我认为这不是一个好的解决方案,因为ShibbolethGuardBundle应该处理这个问题.有谁知道如何以更合适的方式解决这个问题?

Oli*_*ria 0

在我看来,第一次验证并发送用户数据是为了创建一个用户对象或为该网站签名。之后,您使用来自 SSO 服务的数据与站点 A 进行会话,我认为这是预期的行为。它不是与 SSO 服务同步登录/注销。

一种解决方法:在http://romain.pechayre.me/blog/2015/06/26/single-sign-out-problem/中描述了Google如何处理这个问题(不确定这是否仍然是当前的,但它仍然是与您的问题相关):

几天前从 Gmail 注销时,我注意到我的浏览器访问 blogger.com 的时间为 0.5 秒。我回到 blogger.com 并意识到我已退出。youtube.com 上也一样。[...] 主要思想是浏览器实际上访问我在其上进行会话的所有 Google 网站,并关闭所有网站上的会话。[...] 一键从多个网站注销的主要原因没有得到很好的记录,因为这不是一种很常见的情况。当出现此问题时,可能可以使用自定义的内部实现来修复。