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

时间:2016-10-25 08:15:28

标签: php symfony session single-sign-on shibboleth

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

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

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

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

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

我认为这不是一个好的解决方案,因为ShibbolethGuardBundle应该处理这个问题。有没有人知道如何以更恰当的方式解决这个问题?

1 个答案:

答案 0 :(得分: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所有网站并关闭所有这些会话。 [...]一次点击退出几个网站的主要原因没有得到很好的记录,因为这不是一个非常常见的情况。出现此问题时,可能使用自定义的内部实现进行修复。