【问题标题】:Avoid losing PostBack user input after Auth Session has timed out in ASP.NET避免在 ASP.NET 中的 Auth Session 超时后丢失 PostBack 用户输入
【发布时间】:2008-11-14 17:06:02
【问题描述】:
我有一个位于 ASP.NET 表单身份验证后面的表单。到目前为止,实现遵循典型的“开箱即用”类型配置。
一个页面允许用户发布消息。如果用户长时间坐在该页面上撰写消息,它可能会超过身份验证会话到期时间。在这种情况下,帖子不会被记录...它们只是被重定向到登录页面。
我应该采取什么方法来防止长消息丢失的令人沮丧的事件?
显然我可以让身份验证会话变得非常长,但系统中还有其他因素不鼓励这种方法。 有没有办法让这个特定页面例外,只要它是回发,它就永远不会重定向到登录?
【问题讨论】:
标签:
asp.net
session
forms-authentication
【解决方案1】:
我的同事使用 HttpModule 提出了解决此类问题的通用解决方案。
请记住,他决定在此特定应用程序中处理自己的身份验证。
这里是:
他创建了一个 HttpModule 来检测用户何时不再登录。如果用户不再登录,他会获取该页面的 ViewState 以及所有表单变量并将其存储到一个集合中。之后,用户将被重定向到登录页面,其中包含上一页的表单变量和隐藏字段中编码的 ViewState 信息。
用户成功重新验证后,会检查隐藏字段。如果该隐藏字段可用,则会使用旧帖子的表单变量和视图状态填充 HTML 表单。然后使用 Javascript 自动将此表单提交到服务器。
【解决方案2】:
请参阅此related question,其中的答案几乎都是关于登录后保留值的相同概念的主题:
- 登录页面将用户名、密码和以前的 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[] { });
}
}
【解决方案3】:
当会话超时发生时,用户的会话(和页面信息)将被释放,这意味着最终的回发将失败。正如其他人所建议的那样,有一些解决方法,但他们都假设您不关心该特定页面上的身份验证和安全性。
我建议使用 Ajax 每 10 分钟左右以静默方式回发以保持活动状态,或者按照您的建议增加会话的超时时间。您可以尝试在您的网络配置中创建一个特定于页面的部分,并在其中包含更长的超时时间。
【解决方案4】:
我通过将表单值添加到数据库中处理了一次,由远程 IP 而不是用户 ID 标识。
( HttpContext.Request.UserHostAddress )
然后,登录后,可以查看当前用户的IP地址是否在数据库中有一行,并执行所需的操作。
迈克尔