我正在编写一些基于SessionID的日志代码......
但是,当我退出(调用Session.Abandon)并再次登录时,SessionID仍然是相同的。基本上我的PC上的每个浏览器都有自己的会话ID“附加”,并且由于某种原因它不会改变:/
任何想法发生了什么?
我的会话配置如下所示:
<sessionState
mode="InProc"
timeout="1" />
谢谢,Paweł
答案 0 :(得分:14)
查看本文解释session.abandon上的流程
http://support.microsoft.com/kb/899918
取自上面的链接 -
“当您放弃会话时,会话ID cookie不会从用户的浏览器中删除。因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话ID,但是有一个新的会话状态实例“
答案 1 :(得分:5)
这是设计的默认行为,如here所述:
默认情况下会回收已放弃或已过期的会话的会话标识符。也就是说,如果做出包括过期或放弃会话的会话标识符的请求,则使用相同的会话标识符启动新会话。您可以通过将sessionState配置元素的regenerateExpiredSessionId属性设置为true来禁用此功能
您可以如上所述禁用此设置。
编辑:将regenerateExpiredSessionId属性设置为true仅适用于无cookie会话。要解决您的问题,您可以考虑实现继承SessionIDManager类的自定义类。您可以获取有关here和here的信息。
答案 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方法。