在开发站点(使用 Forms 身份验证和 InProc sessionstate)时,经常会遇到我丢失存储在 Session 中的变量(例如 Session["myVar"])的情况,但我的 auth-session 仍然有效。
这会导致我的网站出现一些奇怪的行为。
为什么会发生这种情况,我可以做些什么来防止我的身份验证和会话变量的不同生命周期?
在开发站点(使用 Forms 身份验证和 InProc sessionstate)时,经常会遇到我丢失存储在 Session 中的变量(例如 Session["myVar"])的情况,但我的 auth-session 仍然有效。
这会导致我的网站出现一些奇怪的行为。
为什么会发生这种情况,我可以做些什么来防止我的身份验证和会话变量的不同生命周期?
在 Asp.Net 中,会话和“正在登录”不是一回事。
两者(通常)都由 cookie 控制,但 cookie 是分开的。
要控制 Session 保持活动的时间,请参阅答案Jonas T
。
要控制用户保持登录状态的时间,您可以在<forms ... />
元素上使用 timeOut:
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="120" slidingExpiration="true"/>
</authentication>
...
</system.web>
要解决您的问题,您应该确保会话超时至少与表单身份验证超时一样长。
如果您允许在表单身份验证中保留 cookie(“记住我”),则没有保证。在这种情况下,您只需根据某些标准/规范将会话超时设置为“足够长”。
编辑:还要检查部署站点的应用程序池(在 IIS 下)的设置。并具体检查“ Idle Time-out
”是什么。如果设置得较低(我认为默认值是 20 分钟),那么如果在此期间没有请求进入,IIS 将关闭应用程序池。这(当然)终止了任何存在的进程内会话。
表单身份验证将其票证存储在客户端或 URL 的 Cookie 中(如果禁用 cookie)。
会话变量存储在服务器端并过期。如果您希望您的变量更持久,请使用 cookie。
您可以在 Web 配置中延长会话超时。这是20分钟。
<configuration>
<system.web>
<sessionState timeout="20"></sessionState>
</system.web>
</configuration>
您说您正在使用 ASP.NET 表单身份验证/授权,那么我建议您使用Profile而不是Session
state。