FormsAuthentication.RedirectToLoginPage()不做任何事情
本文关键字:任何事 RedirectToLoginPage FormsAuthentication | 更新日期: 2023-09-27 18:16:32
我有以下问题:重新发布ASP。. NET web应用程序导致(如预期的)会话重置,其中我保留了额外的用户信息(访问尝试将导致NullReferenceException)。
为了避免这种情况,我的页面检查此信息是否存在,并在null的情况下将用户重定向到登录页面(表单验证),所以我调用:
void LogOut()
{
Session.Clear();
Session.Abandon();
User = null;
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage()
}
但有时它不起作用,所以我找到了一个解决方法:
Response.Redirect(FormsAuthentication.LoginUrl);
但是它没有添加returnUrl,我希望它是(我不想手动模拟这个行为)。
所以我想弄清楚为什么第一种方法不像预期的那样工作
您试过在FormsAuthentication.RedirectToLoginPage()
之后呼叫Response.End()
吗?
我有以下问题:重新发布ASP。. NET web应用程序导致(如预期的)会话重置,其中我保留了额外的用户信息(访问尝试将导致NullReferenceException)。
但有时它没有帮助
我不知道你说的"有时它没有帮助"是什么意思。-你没有说到底发生了什么。
但是您应该记住,表单身份验证票据的过期和会话超时的过期是完全独立的。当用户的Forms Authentication ticket仍然有效时,用户的会话可以超时,反之亦然。
一般来说,当从Session访问数据时,应该先测试是否存在,必要时刷新:
object o = Session["Whatever"];
if (o == null)
{
o = ... refresh it e.g. from the database
Session["Whatever"] = o;
}
...
通常使用一个helper类来封装它是很有用的。
在您的情况下,您指的是"附加用户信息"。-所以你可能能够检索这个使用HttpContext.Current.User.Identity.Name
作为一个键。
由于会话过期而强制用户再次登录,例如由于服务器上的应用程序池回收,这是非常不友好的。
RedirectToLoginPage的MSDN文档说明:
不像HttpResponse。方法,此方法不会通过调用HttpResponse.End来结束请求。这意味着RedirectToLoginPage方法调用之后的代码将运行。
这可能解释了您所看到的:在调用RedirectToLoginPage
之后,Page生命周期中的代码正在运行,并抛出NullReferenceException
。
您可以在RedirectToLoginPage
之后调用Response.End
来避免这种情况。
My Session timeout set = Forms auth timeout(通过web.config).
我会重申,会话到期和FormsAuthentication到期是不相关的,即使超时是相同的。FormsAuthentication cookie将在服务器上的应用程序池回收中存活;