如何在ASP.NET站点上的会话到期后处理回发?

时间:2011-03-18 19:35:39

标签: asp.net postback session-timeout

我有一个简单的ASP.NET 4站点。我正在使用表单身份验证。我将会话超时设置为20分钟。此外,当用户进行身份验证时,我将AuthenticationTicket设置为在20分钟后过期。通常一切正常。如果超过20分钟不活动且用户请求网站上的页面,则会按照我的预期将其重定向回“登录”页面。

但是,假设用户位于包含表单的页面上。然后他们等了25分钟。然后他们去提交表格。该站点不会被重定向回登录页面,而是尝试回发,并且我立即得到错误,因为回发中有代码试图从会话中获取信息。

如果AuthenticationTicket和Session已过期,似乎ASP.NET不会在回发时重定向回登录。我怎么处理这个?我希望我不必在每个页面上写特殊代码。

ADDED:web.config代码

<location path="ForgotLogin.aspx">
   <system.web>
      <authorization>
         <allow users="*" />
      </authorization>
   </system.web>
</location>
<system.web>
   <authentication mode="Forms">
      <forms loginUrl="~/Login.aspx"></forms>
   </authentication>
   <authorization>
      <deny users="?" />
   </authorization>
</system.web>

科里

3 个答案:

答案 0 :(得分:1)

如果您未在会话到期时明确计时页面,则需要检查每个页面。

使每个页面继承Page的基类。在该类的页面加载事件中,检查Session.IsNew。您还可以检查其他一些事项,以确保会话已过期。

答案 1 :(得分:1)

我认为您的会话和身份验证Cookie有不同的超时时间。您描述的情况听起来像是一个使用仍然有效的身份验证cookie超时的会话。看看this article。特别是部分用户的身份验证令牌和他的会话之间是否存在依赖关系?适用于您的情况。

答案 2 :(得分:0)

我认为这不是身份验证问题。您可以通过身份验证并使会话过期。 他们彼此独立行事。

您在会话中存储了哪些信息?

如果此信息是针对页面的,我建议将其保留在ViewState或ControlState中。如果您要保留与用户相关的信息。我会创建一个IHttpModule,因此每当Authenticated用户调用您的网站并且您的会话值为null时,您将在用户点击任何页面之前重新创建它们。