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()不做任何事情

您试过在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将在服务器上的应用程序池回收中存活;