我有一个简单的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>
科里
答案 0 :(得分:1)
如果您未在会话到期时明确计时页面,则需要检查每个页面。
使每个页面继承Page的基类。在该类的页面加载事件中,检查Session.IsNew。您还可以检查其他一些事项,以确保会话已过期。
答案 1 :(得分:1)
我认为您的会话和身份验证Cookie有不同的超时时间。您描述的情况听起来像是一个使用仍然有效的身份验证cookie超时的会话。看看this article。特别是部分用户的身份验证令牌和他的会话之间是否存在依赖关系?适用于您的情况。
答案 2 :(得分:0)
我认为这不是身份验证问题。您可以通过身份验证并使会话过期。 他们彼此独立行事。
您在会话中存储了哪些信息?
如果此信息是针对页面的,我建议将其保留在ViewState或ControlState中。如果您要保留与用户相关的信息。我会创建一个IHttpModule,因此每当Authenticated用户调用您的网站并且您的会话值为null时,您将在用户点击任何页面之前重新创建它们。