如何让 SimpleSAMLphp 1.17.2 将用户从我的网站注销?它适用于 SSP 1.16.3

How can I get SimpleSAMLphp 1.17.2 to log the user out of my website? It worked in SSP 1.16.3

我正在使用 SimpleSAMLphp (SSP) 处理我的 Yii 网站的身份验证(通过远程 IdP),1.16.3 版一直运行良好。然而,当我更新我的 composer.json 文件并引入版本 1.17.2 时,我网站上的本地 PHP session 不再被破坏,让用户登录。(用户是但是,成功退出 IdP。)

did some Googling,并查看了看起来相关的讨论:

我还查看了 SimplSAMLphp 邮件列表中的一些讨论:

此外,我使用 SSP 1.16.3 和 1.17.2 记录了请求中的每个 Cookie header、响应中的 Set-Cookie header 和 [=165] 来跟踪注销过程=] 文件在整个过程中的多个步骤中存在,显示出一些明显的差异......但我不知道从这些信息中可以得出什么结论。

当我在我的网站(使用 Yii 1.x 构建)上开始注销过程时...

  1. 我首先打开我网站的一个干净 docker 容器,打开一个全新的私有 Firefox window,然后打开 SAML Tracer。我确认服务器上当前不存在 session 文件(即在新的 docker 容器中)。
  2. 我完成了登录过程。
    • 1.16.3 和 1.17.2 的行为几乎相同。在登录过程结束时...
      • 对于两者,我的 PHP session cookie 的 session 文件存在并且是 7722 字节。
      • 1.16.3:我的 SSP session cookie 的 session 文件存在并且是 2294 字节。
      • 1.17.2:我的 SSP session cookie 的 session 文件存在并且是 2302 字节。
  3. 我转到我网站上的 /auth/logout/,浏览器尽职尽责地发送了我当前的 PHP (PHPSESSID) 和 SSP (SimpleSAML) session 饼干。
    • 1.16.3:没有 Set-Cookie header 是 returned.
    • 1.17.2: Set-Cookie header 为 SSP session cookie returned,但值与之前相同。
  4. 作为注销过程的一部分,我被重定向到异地(到远程 IdP)。
  5. 我 return 被 /simplesaml/module.php/saml/sp/saml2-logout.php/default-sp?SAMLRequest=… 编辑(以及当前 PHP 和 SSP session cookies)。
    • 1.16.3: Set-Cookie header 为 SSP session cookie returned,但值与之前相同。
    • 1.17.2: 两个不同的 Set-Cookie header 被 returned 用于 SSP session cookie,两者都不匹配之前的值。
  6. 我再次被重定向到异地,这是 SAML 注销过程中的进一步步骤。
  7. 我 return 进入 /(我网站的根目录),我的(未更改)PHP session cookie 和(最新的)SSP session 饼干。
    • 1.16.3:
      • a Set-Cookie header return 为 PHP session cookie 编辑,赋予它一个新值。
      • 先前 PHP session cookie 的 session 文件已从服务器中删除。
      • 新 PHP session cookie 的 session 文件是空的。
      • 最近 SSP session cookie 的 session 文件是 474 字节。
      • 我不再登录我的网站。
    • 1.17.2:
      • 没有 Set-Cookie header 被 returned,用于 PHP 或 SSP session cookie。
      • PHP session cookie 的 session 文件是 7722 字节。
      • SSP session cookie 的 session 文件是 338 字节。
      • 我仍然在我的网站上登录(但不是在 IdP 上)。

我可以(某种程度上)通过在注销过程中告诉 Yii return PHP session cookie (PHPSESSID) 的空值来缓解这个问题并将其设置为一小时前过期,但由于 session 文件本身仍然存在,这种方法似乎并不令人满意。

鉴于这些信息,是否有人对我接下来可以查看的位置有任何想法或指示,以确定可能导致此问题的原因?

目前的情况,不知道是我Yii使用不当,还是SSP使用不当,还是SSP 1.17.2的BUG。


我还没有设法将其提炼成一个最小的、可重现的例子,对此我深表歉意。该代码是开源的,但我怀疑是否有人愿意深入研究它:

事实证明,我只需要告诉 SimpleSAML 的会话 class 进行一些清理,之后 PHP 函数 session_name() 恢复返回我的应用程序的会话名称('PHPSESSID') 而不是 SimpleSAMLphp 的会话名称 ('SimpleSAML')。这允许我的应用程序的注销代码终止正确的会话,修复了我将用户从我的应用程序注销的能力。

这是 the code change 为我修复的:

$sspSession = \SimpleSAML\Session::getSessionFromRequest();
$sspSession->cleanup();