在FormsAuthentication.SignOut()之后,Page.User.Identity.IsAuthenticated仍然为true。
我有一个页面,当你按下“注销”时,它将redirect到login.aspx
页面,该页面有一个调用FormsAuthentication.SignOut()
的Page_Load
方法。
主页面显示屏幕右上angular的“注销”链接,并在Page.User.Identity.IsAuthenticated
为true
的情况下显示该Page.User.Identity.IsAuthenticated
。 然而,通过代码后,这种IsAuthenticated
方法并不会自动设置IsAuthenticated
为false
,这是相当恼人的任何想法?
Page.User.Identity.IsAuthenticated
从Page.User
(显然)得到它的值,不幸的是只读,当你调用FormsAuthentication.SignOut()
时不会更新。
幸运的是, Page.User
从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
当您注销当前用户并且希望以实际页面进行响应而不进行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()); }