在发布一个站点(使用Forms身份验证和InProc会话状态)时,经常遇到我丢失存储在Session中的变量的场景(例如Session [“myVar”]),但我的auth-session仍然有效。
这会导致我的网站出现一些奇怪的行为。
为什么会发生这种情况,我该怎么做才能防止我的身份验证和会话变量出现不同的生命周期?
答案 0 :(得分:2)
在Asp.Net中,一个会话和“登录”不是一回事。
两者都(通常)由cookie控制,但cookie是分开的。
要控制会话保持活动的时间,请参阅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将关闭应用程序池。那(当然)终止了现有的任何进程中的会话。
答案 1 :(得分:1)
表单身份验证将其票证存储在客户端的Cookie或URL中(如果禁用了cookie)。
会话变量以过期时间存储在服务器端。如果您希望您的变量更持久,请使用cookie。
您可以在网络配置中延长会话时间。这是20分钟。
<configuration>
<system.web>
<sessionState timeout="20"></sessionState>
</system.web>
</configuration>
答案 2 :(得分:0)
您说您正在使用ASP.NET表单身份验证/授权,然后我建议您使用Profile而不是Session
州。