2

在开发站点(使用 Forms 身份验证和 InProc sessionstate)时,经常会遇到我丢失存储在 Session 中的变量(例如 Session["myVar"])的情况,但我的 auth-session 仍然有效。

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

为什么会发生这种情况,我可以做些什么来防止我的身份验证和会话变量的不同生命周期?

4

3 回答 3

2

在 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 将关闭应用程序池。这(当然)终止了任何存在的进程内会话。

于 2012-07-05T11:59:39.707 回答
1

表单身份验证将其票证存储在客户端或 URL 的 Cookie 中(如果禁用 cookie)。

会话变量存储在服务器端并过期。如果您希望您的变量更持久,请使用 cookie。

您可以在 Web 配置中延长会话超时。这是20分钟。

<configuration>
  <system.web>
     <sessionState timeout="20"></sessionState>
  </system.web>
</configuration>
于 2012-07-05T11:37:09.647 回答
0

您说您正在使用 ASP.NET 表单身份验证/授权,那么我建议您使用Profile而不是Sessionstate。

于 2012-07-05T11:33:40.190 回答