FormsAuthentication.RedirectToLoginPage()什么都不做

时间:2011-12-04 15:52:09

标签: c# asp.net .net session session-state

我遇到以下问题:重新发布ASP.NET Web应用程序会导致(按预期方式)会话重置,我会保留其他用户信息(访问尝试时会导致NullReferenceException)。

为了避免这种情况,我的页面检查此信息是否存在,如果null将用户重定向到登录页面(表单auth),所以我正在调用:

void LogOut()
{
    Session.Clear();
    Session.Abandon();
    User = null;
    FormsAuthentication.SignOut();
    FormsAuthentication.RedirectToLoginPage()
}

但有时它没有帮助,所以我找到了一个解决方法:

Response.Redirect(FormsAuthentication.LoginUrl);

但它没有添加returnUrl,我希望它是什么(我不想手动模拟这种行为)。

所以想弄清楚为什么第一种方法不能按预期工作。

2 个答案:

答案 0 :(得分:5)

您是否尝试在Response.End()之后致电FormsAuthentication.RedirectToLoginPage()

答案 1 :(得分:1)

  

我遇到以下问题:重新发布ASP.NET Web应用程序会导致(按预期方式)会话重置,我会保留其他用户信息(访问尝试时会导致NullReferenceException)。

     

但有时它无济于事

我不确定你的意思是“有时它无济于事” - 你没有说明究竟发生了什么。

但是您应该记住,表单身份验证票证的到期和会话超时的到期是完全独立的。用户的会话可以在其表单身份验证票证仍然有效时超时,反之亦然。

通常,从Session访问数据时,您应该首先测试存在,并在必要时刷新它:

object o = Session["Whatever"];
if (o == null)
{
    o = ... refresh it e.g. from the database
    Session["Whatever"] = o;
}
...

通常使用辅助类来封装它是很有用的。

在您的情况下,您可以参考“其他用户信息” - 因此您可能可以使用HttpContext.Current.User.Identity.Name作为密钥来检索此信息。

强制用户因会话已过期而再次登录,例如因为服务器上的应用程序池回收,非常不友好。

<强>更新

RedirectToLoginPage的MSDN文档指出:

  

与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.End来结束请求。这意味着将运行RedirectToLoginPage方法调用之后的代码。

这可能解释了您所看到的内容:致电RedirectToLoginPage后页面生命周期中的代码正在运行,并抛出NullReferenceException

您可以在Response.End之后致电RedirectToLoginPage以避免这种情况。

  

My Session timeout set = Forms auth timeout(通过web.config)。

我会重新尝试会话到期,并且FormsAuthentication到期是无关的,即使超时恰好相同。 FormsAuthentication cookie将在服务器上的应用程序池回收中存活;会议不会。