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_user 和 PMA_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_user 和 PMA_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 不会在注销时删除会话
Sanctum Laravel 8 用于 API 身份验证的问题(不会在注销时删除令牌)