在Auth Session在ASP.NET中超时后,避免丢失PostBack用户输入

时间:2008-11-14 17:06:03

标签: asp.net session forms-authentication

我有一个位于ASP.NET表单身份验证之后的表单。到目前为止,实现遵循典型的“开箱即用”类型配置。

一个页面允许用户发布消息。如果用户长时间坐在该页面上撰写邮件,则可能会超过验证会话到期时间。在这种情况下,帖子不会被记录......它们只是被重定向到登录页面。

我应该采取什么方法来防止长信息丢失的令人沮丧的事件?

显然,我可以让auth会话真的很长,但系统中还有其他因素阻碍了这种方法。 有没有办法可以为这个特定的页面设置一个例外,这样只要它回发就不会重定向到Login?

4 个答案:

答案 0 :(得分:1)

我的同事使用HttpModule想出了解决这类问题的一般解决方案。

请记住,他决定在这个特定的应用程序中处理自己的身份验证。

这里是:

他创建了一个HttpModule,用于检测用户何时不再登录。如果用户不再登录,则将该页面的ViewState与所有表单变量一起存储到集合中。之后,用户被重定向到登录页面,其中包含上一页的表单变量和隐藏字段中编码的ViewState信息。

用户成功重新验证后,会检查隐藏字段。如果该隐藏字段可用,则使用旧帖子的表单变量和viewstate填充HTML表单。然后使用Javascript自动将此表单提交给服务器。

答案 1 :(得分:1)

请参阅此related question,其中的答案几乎都是关于在登录后保持价值观的相同概念的主题:

  • 登录页面POSTS用户名,密码和以前的POST变量到引用页面。在用户中引用页面日志并执行操作。
  • 登录页面写出表单变量,Javascript在成功登录后提交到引用页面
  • AJAX登录

如果他们不关心他们是否登录了POST(对我来说似乎有点安全......)然后在IHttpModule中挂钩HttpContext.PostAuthenticateRequest会让你有机会重新使用FormsAuthentication.SetAuthCookie。可以通过设置HttpContext.User类似地使用FormsAuthenticationModule.Authenticate事件:

// Global.asax
void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) {
   // check for postback somehow
   if (Request.Url == "MyPage.aspx" && Request.Form["MySuperSecret"] == "123") {
      e.User = new GenericPrincipal(new GenericIdentity(), new string[] { });
   }
}

答案 2 :(得分:0)

当会话超时发生时,用户的会话(和页面信息)将被释放,这意味着最终的回发将失败。正如其他人所建议的那样有一些解决方法,但他们都假设你不关心那个特定页面上的身份验证和安全性。

我建议使用Ajax每隔10分钟静默回发以保持活动,或者按照建议增加会话超时。您可以尝试在Web配置中创建特定于页面的部分,并在其中包含更长的超时。

答案 3 :(得分:0)

我通过将表单值添加到数据库来处理这一次,由远程IP而不是用户ID标识。

( HttpContext.Request.UserHostAddress )

然后,在登录后,您可以检查当前用户的IP地址是否在数据库中有一行,并执行所需的操作。

迈克尔