我正在编写一些基于 SessionID 的日志记录代码......
但是,当我注销(调用 Session.Abandon)并再次登录时,SessionID 仍然相同。基本上,我 PC 上的每个浏览器都有自己的“附加”会话 ID,并且由于某种原因它不会改变:/
有什么想法吗?
我的会话配置如下所示:
<sessionState
mode="InProc"
timeout="1" />
谢谢,帕维尔
查看这篇文章,它解释了 session.abandon 上的过程
http://support.microsoft.com/kb/899918
取自以上链接——
“当您放弃会话时,会话 ID cookie 不会从用户的浏览器中删除。因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话 ID,但会有一个新的会话状态实例"
这是设计的默认行为,如下所述:
默认情况下,已放弃或过期会话的会话标识符被回收。也就是说,如果发出的请求包括过期或放弃会话的会话标识符,则使用相同的会话标识符启动新会话。您可以通过将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true 来禁用此功能
您可以如上所述禁用此设置。
编辑:将 regenerateExpiredSessionId 属性设置为 true 仅适用于无 cookie 会话。为了克服您的问题,您可以考虑实现一个继承 SessionIDManager 类的自定义类。您可以在此处和此处获取相关信息。
这是一篇旧文章,但如果有人仍在寻找答案,这里有一个完整的分步解决方案,说明如何每次都使用新的会话 ID 实现干净的注销。
请注意,本文仅适用于启用 cookie (cookieless=false) 的网站。
步骤 (1) 修改您的 web.config 文件并添加“regenerateExpiredSessionID”标志,如下所示 -
<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" />
步骤 (2) 在您的注销事件中添加以下代码 -
Session.Clear();
Session.Abandon();
Response.Cookies.Add(New HttpCookie("ASP.NET_SessionId", ""));
Response.redirect(to you login page);
步骤 (3) 在登录页面的 page_load 事件中添加以下代码 -
if(!IsPostBack)
{
Session.Clear();
Session.Abandon();
}
第 2 步和第 3 步有一个重要目的。此代码确保在您单击“登录”按钮后生成一个全新的会话 ID。这可以防止弱会话管理(会话固定漏洞),该漏洞可能会在您网站的第三方渗透测试期间被发现。
希望这可以帮助。
这对我有用,唯一需要注意的是此代码需要与您的登录例程分开。
Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30)
页面加载完成后才会生效。在我的应用程序中,我有一个简单的安全例程,它强制使用新 ID,如下所示:
if session("UserID") = "" then
Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30)
Response.Redirect("login.aspx")
end if
您可以明确清除会话 cookie。您应该通过配置控制cookie名称,并在清除时使用相同的名称。
编辑:当会话被放弃时清除会话 cookie 将强制 ASP.NET 为下一个请求创建新的会话和会话 ID。顺便说一句,清除会话 cookie 的另一种方法是使用SessionIDManager.RemoveSessionID方法。