phpmyadmin sso 不会在注销时删除现有会话

Posted

技术标签:

【中文标题】phpmyadmin sso 不会在注销时删除现有会话【英文标题】:phpmyadmin sso doesn't remove existing session in logout 【发布时间】:2014-06-15 12:31:15 【问题描述】:

我正在尝试在我的自定义应用程序中使用 phpMyAdmin SSO,它是在 Yii 框架中制作的。按照 phpMyAdmin 指南,我在 config.inc.php 中进行了必要的更改

$cfg['Servers'][$i]['auth_type'] = 'signon';
$cfg['Servers'][$i]['SignonSession'] = 'MYSESSID';
$cfg['Servers'][$i]['SignonURL'] = 'http://myapp.com/site/login';
$cfg['Servers'][$i]['LogoutURL'] = 'http://myapp.com/site/logout';

PHPMyAdmin 链接到http://myapp.com/phpmyadmin/,在我的应用程序中,当有人登录时,我使用用户名和密码值设置 PMA_single_signon_userPMA_single_signon_password。在注销操作中,我销毁会话(Yii::app()->session->destroy() 相当于 session_unset();session_destroy())。

当用户成功登录应用程序后,他可以单击 phpmyadmin 链接,他将成功重定向到 phpmyadmin 界面。

当用户退出应用程序时,不会关闭浏览器并再次登录,我的 phpmyadmin 链接会重定向到登录 (SignonURL),即使用户已成功登录。

在 phpmyadmin/libraries/plugins/auth/AuthenticationSignon.class.php 中使用 firebug 和一些 var_dumps 我注意到在注销后 phpmyadmin 仍然使用路径 /phpmyadmin/ 下的 MYSESSID,它具有上一个会话的值。

例如,我登录到 myapp.com/site/login 并得到 ​​p>

MYSESSID="value1" path=/ 

我成功地点击了 myapp.com/phpmyadmin/ 链接。现在我在 br 中有两个 MYSESSID

MYSESSID="value1" path=/ 
MYSESSID="value1" path=/phpmyadmin/

我注销(不关闭浏览器窗口)并再次登录,在 MYSESSID 中获得一个新值,例如:

MYSESSID="value2" path=/ 

我单击 myapp.com/phpmyadmin/ 链接(我在重定向到 SingonURL 之前退出)并查看这些会话:

MYSESSID="value2" path=/ 
MYSESSID="value1" path=/phpmyadmin/

从 AuthenticationSignon.class.php 我了解到,由于 phpmyadmin 在 MYSESSID="value1" 内搜索,它找不到所需的 PMA_single_signon_userPMA_single_signon_password 因为我将它们放在 MYSESSID="value2" 下。

我所理解的底线是,当我在注销期间销毁会话时, path=/phpmyadmin/ 下定义的会话不会被删除。

任何人都知道如何正确注销或删除 path=/phpmyadmin/ 下的会话?

当我关闭浏览器窗口时,路径 / 和 /phpmyadmin/ 的 MysESSID="value1" 被完全删除,因此重新登录工作正常。

注意:我只使用 myapp.com,根本不使用 www.myapp.com

【问题讨论】:

我还不能发布答案,所以我把它写在评论里。似乎删除 /phpmyadmin/ 路径下的会话的方法是执行 setcookie("WPCPSESSID", $_COOKIE["MYSESSID"],time()-100, '/phpmyadmin/');在注销操作中,实际上创建一个具有过去过期时间的新 cookie。这样会话到期而不必关闭窗口。 session_unset();session_destroy();仅删除“/”路径下的 cookie。 【参考方案1】:

解决方案是显式设置一个带有过去时间的会话 cookie(因此已经过期)

setcookie("WPCPSESSID", $_COOKIE["MYSESSID"],time()-100, '/phpmyadmin/'); 

这样 phpmyadmin 会话将过期而无需关闭窗口。

似乎 session_unset();session_destroy();仅删除“/”路径下的会话 cookie,而不是子页面(例如 /phpmyadmin/)

【讨论】:

以上是关于phpmyadmin sso 不会在注销时删除现有会话的主要内容,如果未能解决你的问题,请参考以下文章

身份提供商(salesforce)注销SSO时注销服务提供商(passport-saml)

为啥 Node 中的 PassportJS 不会在注销时删除会话

phpmyadmin 自动注销时间

Sanctum Laravel 8 用于 API 身份验证的问题(不会在注销时删除令牌)

执行 Auth0/Google 联合 SSO 注销时如何将用户重定向回我的应用程序?

让 phpMyAdmin 进入项目并且不会在颠覆中导致错误