【问题标题】:ASP.NET MVC - Erasing session data after fer minutes of inactivityASP.NET MVC - 在 fer 分钟不活动后擦除会话数据
【发布时间】:2013-01-17 06:20:53
【问题描述】:
在我的 Web 应用程序中,我经常可以看到,当我有几分钟没有做任何事情,然后我回来并刷新页面时 - 我仍在登录,但我的会话数据全部消失了!
在login() 操作中,我设置了几个Session[] 对象,这些对象是页面正常工作所必需的。我不知道它为什么会这样做,但我需要它在清除用户会话数据时注销用户。
我已阅读有关设置<sessionState mode="InProc" timeout="20"/> 的信息,但是每次我刷新页面时都会刷新此超时吗?或者它会在我登录后 20 分钟后用完?如果我让这个计时器比我保持用户在线的时间更大怎么办?
【问题讨论】:
标签:
asp.net
asp.net-mvc
asp.net-mvc-3
【解决方案1】:
回发到服务器将使会话保持更长时间。这是一个滑动到期。客户端有两种处理方式,客户端不知道这个 20 分钟超时:
- 使用客户端 javascript 创建一个计时器,在 20 分钟后重定向到注销页面
- 每当回发发生时,检查会话是否过期(可以通过多种方式完成,例如检查 Session.IsNewSession,查看您的对象是否丢失等),然后在处理之前重定向到注销处理程序请求。
【解决方案2】:
尝试检查一下:
问:在 Proc 模式下,为什么我偶尔会丢失所有会话?
A:请参阅“理解会话”中的“稳健性”部分
状态模式”部分。
稳健性
InProc - 如果工作进程会丢失会话状态
(aspnet_wp.exe) 回收,或者如果 appdomain 重新启动。这是因为
会话状态存储在 appdomain 的内存空间中。这
重启可能是由某些配置文件的修改引起的,例如
如 web.config 和 machine.config,或 \bin 目录中的任何更改
(例如使用 VS 重新编译应用程序后的新 DLL)
详细信息,请参阅 KB324772。在 v1 中,还有一个 bug 会导致
工作进程重新启动。它已在 SP2 和 v1.1 中修复。看
KB321792。
来源 - http://forums.asp.net/t/7504.aspx/1
【解决方案3】:
我假设您正在使用表单身份验证。那是对的吗?如果是这样,您需要让表单身份验证票证的超时时间与会话超时时间相匹配。
用户通过一个比最初看起来更复杂的过程保持登录状态。 cookie 存储在用户的浏览器中,称为 Forms Authentication Ticket。如果用户在会话超时限制之后保持空闲状态,服务器将丢弃会话。但在下一个请求中,Forms Authentication Ticket 将被传回 Web 服务器。服务器验证票证,如果票证仍然有效,则用户重新登录。
如您所见,用户的会话没有恢复。如果您想要这种行为,则必须自己检测这种情况并恢复会话。
解决方法是将Forms Authentication Ticket 的超时时间设置为与Session 的超时时间相同。您可以在 Web.config 文件中完成此操作,as explained here:
<system.web>
<authentication mode="Forms">
<forms timeout="20"/>
</authentication>
</system.web>
超时值以分钟为单位。一旦 Forms Authentication Ticket 超时,用户将被注销。这与会话的超时无关,但如果它们相同,它们将在大致相同的时间到期。如果您想完全安全,请将 Forms Authentication Ticket 超时设置为比会话超时短一点。用户将在会话超时之前注销。当他们再次登录时,他们将获得一个新会话。旧会话最终会自行超时。