我希望能够在用户结束我们的应用程序会话时记录,并记录它是退出还是会话已过期。我正在使用
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)
答案 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将被浏览器丢弃,因此需要重新登录。