代码之家  ›  专栏  ›  技术社区  ›  andrewm

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

  •  61
  • andrewm  · 技术社区  · 14 年前

    我有一个页面,当您按“注销”时,它将重定向到 login.aspx 包含 Page_Load 调用的方法 FormsAuthentication.SignOut()

    母版页在屏幕右上角显示“注销”链接,并在以下条件下显示 Page.User.Identity.IsAuthenticated true . 但是,在单步执行代码之后,这个signout方法不会自动设置 IsAuthenticated false 哪一个很烦人,有什么想法吗?

    6 回复  |  直到 10 年前
        1
  •  102
  •   Mart    12 年前

    Page.User.Identity.IsAuthenticated 从中获取其值 Page.User (显然)很遗憾,它是只读的,在您调用时不会更新 FormsAuthentication.SignOut() .

    幸运的是 Context.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 在同一个页面请求中需要它的地方。

        2
  •  12
  •   Brian Ball    14 年前

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

    例如,当有人登录时。当您设置窗体身份验证cookie以指示它们已登录时,如果您检查它们是否在同一请求上经过身份验证,它将返回 false ,但在下次请求时,它将返回 true . 当你注销某人时也会发生同样的情况。在该请求期间,它们仍然是经过身份验证的,但在下一次请求中,它们将不再经过身份验证。因此,如果用户单击链接注销,则应将其注销 然后 向登录页发出重定向。

        3
  •  6
  •   PatrickSteele    14 年前

    FormsAuthentication.SignOut();
    Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
    
        4
  •  4
  •   Michel van Engelen    8 年前

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

    FormsAuthentication.SignOut()
    Session.Abandon()
    FormsAuthentication.RedirectToLoginPage()
    HttpContext.Current.ApplicationInstance.CompleteRequest()
    return
    

    已验证 在login.aspx中。

        5
  •  1
  •   James McCormack    14 年前

    在login.aspx页面加载方法中:

    if (!this.IsPostBack)
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            FormsAuthentication.SignOut();
            Response.Redirect(Request.RawUrl);
        }
    }
    
        6
  •  1
  •   deHaar    6 年前

    在我的一个应用程序中,当我使用凭据登录时,导航到应用程序中的不同表单,然后复制一个导航的表单url,然后从应用程序中注销。在“搜索”选项卡中,我粘贴了浏览器在未登录的情况下导航到应用程序中特定表单的url。 检查表单身份验证时 page.User.Identity.IsAuthenticated 甚至在注销时也是如此。原因是在注销时清除会话时我添加了

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

    有了这个我就不会再有那个问题了 当我们在没有登录的情况下导航到应用程序中的不同表单时,会变成false。

        7
  •  0
  •   Korayem Praphul Katlana    7 年前

    有评论说我的回答对很多人都不起作用。2011年,我在撕碎自己的耳朵后写下了这个答案。所以我很肯定它解决了这个问题。

    我开始研究这个6年前的问题 came to this solution 我相信这可能是删除cookie的正确方法,即通过再次创建cookie,但过期。


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