asp.net中的会话和auth

时间:2012-07-05 11:26:52

标签: asp.net forms-authentication session-state

在发布一个站点(使用Forms身份验证和InProc会话状态)时,经常遇到我丢失存储在Session中的变量的场景(例如Session [“myVar”]),但我的auth-session仍然有效。

这会导致我的网站出现一些奇怪的行为。

为什么会发生这种情况,我该怎么做才能防止我的身份验证和会话变量出现不同的生命周期?

3 个答案:

答案 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州。