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

lis*_*ite 61 c# asp.net forms-authentication

我有一个页面,当你按"注销"它会重定向到login.aspx有一个Page_Load方法调用的页面FormsAuthentication.SignOut().

母版页会显示在屏幕的右上角的"注销"链接并显示它的条件Page.User.Identity.IsAuthenticatedtrue.然而,通过单步执行代码后,该signout方法不会自动设置IsAuthenticatedfalse这是相当恼人的,任何想法?

Mar*_*art 100

Page.User.Identity.IsAuthenticatedPage.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
Run Code Online (Sandbox Code Playgroud)

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

  • 稍微延迟了你,但我遇到了同样的问题,发现你的优秀问题没有适当的答案.我希望它会帮助别人. (12认同)
  • 与MVC4完美配合,只需稍加改动:`HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty),null);` (8认同)
  • 我也去了 HttpContext.Current.User = null; 如果您正在检查空“用户”,则很有用。 (2认同)

Bri*_*all 12

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

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


Pat*_*ele 6

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

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
Run Code Online (Sandbox Code Playgroud)