我有一个页面,当您按“退出”时,它会重定向到login.aspx
页面,其中Page_Load
方法调用FormsAuthentication.SignOut()
。
主页面显示屏幕右上角的“退出”链接,并在Page.User.Identity.IsAuthenticated
为true
的情况下显示该链接。然而,在单步执行代码之后,此注销方法不会自动将IsAuthenticated
设置为false
,这非常烦人,有什么想法吗?
答案 0 :(得分:99)
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
当您注销当前用户并希望在不进行重定向的情况下回复实际页面时,这非常有用。您可以在同一页面请求中查看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());
}