在FormsAuthentication.SignOut()之后,Page.User.Identity.IsAuthenticated仍然为true

时间:2010-10-29 10:18:19

标签: c# asp.net forms-authentication

我有一个页面,当您按“退出”时,它会重定向到login.aspx页面,其中Page_Load方法调用FormsAuthentication.SignOut()

主页面显示屏幕右上角的“退出”链接,并在Page.User.Identity.IsAuthenticatedtrue的情况下显示该链接。然而,在单步执行代码之后,此注销方法不会自动将IsAuthenticated设置为false,这非常烦人,有什么想法吗?

7 个答案:

答案 0 :(得分:99)

Page.User.Identity.IsAuthenticatedPage.User获取其值(很明显),遗憾的是这是只读的,并且在您致电FormsAuthentication.SignOut()时不会更新。

幸运的是,Page.UserContext.User中提取了可以修改的值:

// HttpContext.Current.User.Identity.IsAuthenticated == true;

FormsAuthentication.SignOut();
HttpContext.Current.User =
    new GenericPrincipal(new GenericIdentity(string.Empty), null);

// now HttpContext.Current.User.Identity.IsAuthenticated == false
// and Page.User.Identity.IsAuthenticated == false

当您注销当前用户并希望在不进行重定向的情况下回复实际页面时,这非常有用。您可以在同一页面请求中查看IsAuthenticated您需要的位置。

答案 1 :(得分:11)

每个请求只会对一个人进行一次身份验证。一旦ASP.NET确定它们是否经过身份验证,那么它对于该请求的剩余部分不会改变。

例如,当有人登录时。当你设置表单auth cookie表明他们已登录时,如果你检查他们是否在同一个请求上进行了身份验证,它将返回false,但是下一个请求,它将返回true。当你把某人记录下来时也会发生同样的情况。它们仍然在该请求期间进行身份验证,但在下一个请求期间,它们将不再经过身份验证。因此,如果用户单击要注销的链接,则应将其注销然后向登录页面发出重定向。

答案 2 :(得分:6)

我记得有一个类似的问题,我想我通过在注销时使表单身份验证cookie失效来解决它:

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);

答案 3 :(得分:4)

为什么要在login.aspx中执行注销代码?

将此代码放入例如logout.aspx:

FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return
login.aspx中的

IsAuthenticated false 。 登录和注销代码现已分开:单一责任。

答案 4 :(得分:1)

在您的login.aspx Page_Load方法中:

if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}

答案 5 :(得分:1)

在我的一个应用程序中,当我使用凭据登录时,导航到应用程序中的不同表单,然后我复制了其中一个导航表单url,然后从该应用程序注销。在搜索选项卡中,我粘贴了浏览器导航到我应用程序中特定表单的URL,而无需登录。 在检查表单身份验证为page.User.Identity.IsAuthenticated时也是如此,即使我们注销也是如此。其原因是在清除注销会话时我已经添加了

Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);

有了这个,我再也不会遇到这个问题,并且当我们在未登录的情况下导航到应用程序中的不同表单时,标志page.User.Identity.IsAuthenticated会变为假。

答案 6 :(得分:0)

更新

  

我得到的评论是,我的回答与许多人无关。撕掉我的听力之后,我在2011年写了这个答案。所以我很确定它解决了这个问题。

     

我开始研究这个6岁的问题和came to this solution,我认为这可能是删除cookie的正确方法,即通过再次创建它们但过期日期。


这对我有用

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }