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

我有一个页面,当你按下“注销”时,它将redirect到login.aspx页面,该页面有一个调用FormsAuthentication.SignOut()Page_Load方法。

主页面显示屏幕右上angular的“注销”链接,并在Page.User.Identity.IsAuthenticatedtrue的情况下显示该Page.User.Identity.IsAuthenticated 。 然而,通过代码后,这种IsAuthenticated方法并不会自动设置IsAuthenticatedfalse ,这是相当恼人的任何想法?

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 

当您注销当前用户并且希望以实际页面进行响应而不进行redirect时,这非常有用。 您可以在同一个页面请求中检查IsAuthenticated在哪里需要它。

一个人只有每个请求的身份validation一次。 一旦ASP.NET确定它们是否被authentication,那么对于该请求的剩余部分它不会改变。

例如,当某人login时。当您设置表单auth cookie表示他们已经login时,如果您检查是否在同一个请求上进行了身份validation,它将返回false ,但在下一个请求时,它将返回true 。 当你login某人时也是如此。 它们在请求期间仍然被authentication,但是在下一个请求期间,它们将不再被authentication。 所以如果用户点击一个链接注销,你应该注销, 然后发出redirect到login页面。

我记得有一个类似的问题,我想我通过在注销时到期表单身份validationcookie来解决它:

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

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

把这个代码放在例如logout.aspx:

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

在login.aspx中, IsAuthenticated将为false 。 login和注销代码现在分开:单一责任。

在你的login.aspx Page_Load方法中:

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

这对我有用

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