Session.Abandon 调用后 SessionID 仍然相同
Posted
技术标签:
【中文标题】Session.Abandon 调用后 SessionID 仍然相同【英文标题】:SessionID is still the same after Session.Abandon call 【发布时间】:2011-04-12 14:12:08 【问题描述】:我正在编写一些基于 SessionID 的日志记录代码...
但是,当我注销(调用 Session.Abandon)并再次登录时,SessionID 仍然相同。基本上,我 PC 上的每个浏览器都有自己的“附加”会话 ID,并且由于某种原因它不会改变:/
有什么想法吗?
我的会话配置如下所示:
<sessionState
mode="InProc"
timeout="1" />
谢谢,帕维尔
【问题讨论】:
为什么要删除会话 ID?如果你能在这里回答我的问题,这将对我有很大帮助:***.com/questions/37642982/… 【参考方案1】:这是here 所述的默认设计行为:
默认情况下,已放弃或过期会话的会话标识符会被回收。也就是说,如果发出的请求包括过期或放弃会话的会话标识符,则使用相同的会话标识符启动新会话。您可以通过将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true 来禁用此功能
您可以如上所述禁用此设置。
编辑:将 regenerateExpiredSessionId 属性设置为 true 仅适用于无 cookie 会话。为了克服您的问题,您可以考虑实现一个继承 SessionIDManager 类的自定义类。您可以获取有关here 和here 的信息。
【讨论】:
谢谢。 Howewer msdn.microsoft.com/en-us/library/h6bb9cz9%28v=VS.90%29.aspx 声称 regenerateExpiredSessionId 默认值设置为 true。反正我现在做了,设置regenerateExpiredSessionId="true",SessionID还是一样。 是的 - 这应该有效,但随后文档指出这仅适用于无 cookie 会话。请参阅msdn.microsoft.com/en-us/library/… 处的备注 天哪 :/ 所以...有没有办法使用非无 cookie 会话重新生成 SessionID,我很困惑。 是的,该设置适用于无 cookie 会话,其中 sessionid 在浏览器请求之间的 url 中传递。 创建自己的 SessionIdManager 不太可能解决问题,因为除非清除会话 cookie,否则 ASP.NET 很可能不会调用 CreateSessionID。【参考方案2】:您可以明确清除会话 cookie。您应该通过configuration控制cookie名称并在清除时使用相同的名称。
编辑: 放弃会话时清除会话 cookie 将强制 ASP.NET 为下一个请求创建新的会话和会话 ID。顺便说一句,清除会话 cookie 的另一种方法是使用 SessionIDManager.RemoveSessionID 方法。
【讨论】:
【参考方案3】:查看这篇解释 session.abandon 过程的文章
http://support.microsoft.com/kb/899918
取自以上链接 -
“当您放弃会话时,会话 ID cookie 不会从用户的浏览器中删除。因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话 ID,但会有一个新的会话状态实例”
【讨论】:
是的。这是您必须在注销代码中执行的操作:Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));在 Web.config 中这样做:这对我有用,唯一需要注意的是,此代码需要与您的登录例程分开。
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
【讨论】:
我使用了下面的代码,HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddYears(-30)。但是,如果您有现有的会话值,请将它们存储在内存中并执行上述操作,否则会话中的所有值都将被清除。另外需要注意的一点是,正如 shitburg 所说,新的会话 ID 仅在重新加载时生成。【参考方案5】:这是一篇旧帖子,但如果有人仍在寻找答案,这里有一个完整的分步解决方案,说明如何每次都使用新的会话 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。这可以防止弱会话管理(会话固定漏洞),该漏洞可能会在您网站的第 3 方渗透测试期间被发现。
希望这会有所帮助。
【讨论】:
以上是关于Session.Abandon 调用后 SessionID 仍然相同的主要内容,如果未能解决你的问题,请参考以下文章
Session.Abandon与Session.Clear之间的区别
在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除
当 Session.Abandon() 不起作用时,如何以编程方式结束 asp.net 中的会话?
session.invalidate()和session.abandon()有啥不同,该如何选择?
What is the difference between Session.Abandon() and Session.Clear()