15

我正在编写一些基于 SessionID 的日志记录代码......

但是,当我注销(调用 Session.Abandon)并再次登录时,SessionID 仍然相同。基本上,我 PC 上的每个浏览器都有自己的“附加”会话 ID,并且由于某种原因它不会改变:/

有什么想法吗?

我的会话配置如下所示:

    <sessionState
       mode="InProc"
       timeout="1" />

谢谢,帕维尔

4

5 回答 5

14

查看这篇文章,它解释了 session.abandon 上的过程

http://support.microsoft.com/kb/899918

取自以上链接——

“当您放弃会话时,会话 ID cookie 不会从用户的浏览器中删除。因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话 ID,但会有一个新的会话状态实例"

于 2010-09-15T09:37:45.197 回答
5

这是设计的默认行为,如下所述

默认情况下,已放弃或过期会话的会话标识符被回收。也就是说,如果发出的请求包括过期或放弃会话的会话标识符,则使用相同的会话标识符启动新会话。您可以通过将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true 来禁用此功能

您可以如上所述禁用此设置。

编辑:将 regenerateExpiredSessionId 属性设置为 true 仅适用于无 cookie 会话。为了克服您的问题,您可以考虑实现一个继承 SessionIDManager 类的自定义类。您可以在此处此处获取相关信息。

于 2010-09-15T09:34:15.580 回答
3

这是一篇旧文章,但如果有人仍在寻找答案,这里有一个完整的分步解决方案,说明如何每次都使用新的会话 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。这可以防止弱会话管理(会话固定漏洞),该漏洞可能会在您网站的第三方渗透测试期间被发现。

希望这可以帮助。

于 2018-02-07T03:08:34.730 回答
2

这对我有用,唯一需要注意的是此代码需要与您的登录例程分开。

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
于 2011-10-31T14:27:20.110 回答
0

您可以明确清除会话 cookie。您应该通过配置控制cookie名称,并在清除时使用相同的名称。

编辑:当会话被放弃时清除会话 cookie 将强制 ASP.NET 为下一个请求创建新的会话和会话 ID。顺便说一句,清除会话 cookie 的另一种方法是使用SessionIDManager.RemoveSessionID方法。

于 2010-09-15T09:37:31.507 回答