停止站点在到期时重用会话ID

时间:2010-09-30 17:35:32

标签: c# asp.net asp.net-mvc session-state

我希望能够在用户结束我们的应用程序会话时记录,并记录它是退出还是会话已过期。我正在使用

cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

在注销时设置新的sessionId,但是当会话到期时,如果浏览器实例未关闭,则会重用sessionId。在我的web.config中,我使用了

        <sessionState mode="InProc" timeout="1" cookieName="session" regenerateExpiredSessionId="true" />

但仍然可以重复使用会话。

我无法杀死Session_end()中的cookie,因为我没有访问权限,因为没有HttpContext或请求,所以我无法以这种方式重置它。

有没有人有任何想法如何从Global.asax.cs文件强制新的sessionId?

由于

戴夫

编辑 - 目前在我们的开发环境中,但我们的生产应用程序使用状态服务器进行会话。不确定这是否会对sessionId Allocation产生影响(我知道我需要使用自定义IHttpModule而不是Session_end)

2 个答案:

答案 0 :(得分:4)

根据RegenerateExpiredSessionId属性的文档:

  

默认情况下,只有无Cookie的网址   重新发行时   RegenerateExpiredSessionId已启用

所以,除非你正在使用无cookie会话,否则你运气不好

您对这些需要新会话ID的会话ID有何看法?将它们存储在db或某处以供以后查找?如果是这样,也许你应该考虑使用你可以控制的其他类型的id(比如sql server上的标识列)。

顺便说一句 - 你真的希望你的会话在一分钟内超时,还是只是一个测试的东西?

答案 1 :(得分:4)

首先,您将无法跟踪会话何时结束,因为在使用InProc以外的任何状态机制时,无法保证触发全局Session_End。

会话cookie是非持久性的,因此您可以解决的问题唯一方法是,如果用户打开浏览器实例并且会话因不活动而超时,则重新访问该页面。您可以在Session_Start和Session_End中记录会话ID,并且您的数据库日志会更加健壮,因为您可以识别超时/重新登录行为。

您可以使用Session.IsNewSession来检测当前会话是否是使用当前请求创建的。 (无论提供的sessionid id是什么)。

如果您使用会话ID来跟踪用户是否“登录”,您应该避免使用它,而是使用可以配置超时的asp.net auth cookie。 (意味着cookie本身具有在每个视图上刷新的过期,但在超时之后,cookie将被浏览器丢弃,因此需要重新登录。