Session.Abandon调用后SessionID仍然相同

时间:2010-09-15 09:22:35

标签: asp.net sessionid

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

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

任何想法发生了什么?

我的会话配置如下所示:

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

谢谢,Paweł

5 个答案:

答案 0 :(得分:14)

查看本文解释session.abandon上的流程

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

取自上面的链接 -

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

答案 1 :(得分:5)

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

  

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

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

编辑:将regenerateExpiredSessionId属性设置为true仅适用于无cookie会话。要解决您的问题,您可以考虑实现继承SessionIDManager类的自定义类。您可以获取有关herehere的信息。

答案 2 :(得分: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

答案 3 :(得分:2)

这是一篇旧帖子,但如果有人仍在寻找答案,这里有一个完整的逐步解决方案,介绍如何每次都使用新的会话ID实现干净注销。

请注意,本文仅适用于启用cookie的(cookieless = false)网站。

步骤(1)修改您的web.config文件&amp;添加&#34; regenerateExpiredSessionID&#34;标志为 -

<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步有一个重要目的。此代码确保在您单击&#34;登录&#34;之后生成全新的会话ID。按钮。这可以防止在您的站点的第三方渗透测试期间发现的弱会话管理(会话修复漏洞)。

希望这有帮助。

答案 4 :(得分:0)

您可以明确清除会话cookie。您应该按configuration控制Cookie名称,并在清除时使用相同的名称。

编辑: 在会话被放弃时清除会话cookie将迫使ASP.NET创建新会话&amp; sessionid用于下一个请求。顺便说一下,清除会话cookie的另一种方法是使用SessionIDManager.RemoveSessionID方法。