用户注销时,我在删除cookie时几乎没有问题。
我正在学习 MVC Asp.Net 并创建了默认的 MVC5 应用程序。我已经注册并使用帐户登录,一切都很好。但是当我点击注销时,它正在工作,它会将我重定向到主页,但它没有删除 cookie。
我正在使用这个浏览器扩展名"编辑此cookie"检查cookie。
首先我登录,然后使用EditThisCookie扩展程序复制cookie,然后注销并删除cookie。现在,当我将复制的cookie粘贴到EditTshiCookie扩展中并刷新页面时,它会使用相同的帐户登录。饼干不会被删除。
注销方法
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
我已经从这个问题中尝试过这个
Request.GetOwinContext().Authentication.SignOut();
Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
您理解基于 cookie 的身份验证的方式是错误的:)
- 登录应用程序会创建 authcookie,其中包含有关用户身份验证和声明(权限)的信息。服务器会话中不会写入任何内容或以任何其他方式保留。
- 在登录后的每个请求中,cookie都会被解码并验证用户是否仍经过身份验证。如果为 true,它将解码声明,以便以后可以使用它们
AuthorizeAttribute
- 注销会从浏览器中删除该 cookie,但如果您以任何方式保留了该 cookie 并将其再次放入另一个请求中,则 owin 将认为它仍然是经过身份验证且有效的用户。
Session.Abandon
无济于事,因为DefaultAuthenticationTypes.ApplicationCookie
不是基于会话的。
如果这不是期望的行为。 您可以向会话添加一些标志( IsAuthorized
) 并签入 。然后Global.asax Application_PreRequestHandlerExecute
重定向到登录表单。这样,您将获得有关服务器和客户端的信息。但请记住,如果服务器会话状态失败(例如重新启动 IIS),所有实际登录的用户都将注销。
有关基于 Cookie 的身份验证链接的更多信息
回复很晚,无论如何,试图减少堆栈溢出未回答的负载。
为了标识每个请求,服务器为 Web 应用程序的每个用户分配一个唯一的会话 ID。服务器通过会话 ID 标识用户。用户的服务器端会话在会话 ID 上分配。将其视为以下模型。
Session ID
|---------------- Session 1
|---------------- Session 2
(放弃 cookie 会话时,所有相关的 .NET 会话都将从服务器中删除)
因此,当您从浏览器中删除会话cookie时,服务器不会识别请求并将其视为新请求,并且似乎用户已被注销。
但是由于服务器尚未放弃/删除会话,如果您尝试在浏览器中再次使用复制的会话值,服务器将识别请求的会话 ID,并且用户将再次登录。
您也可以使用不同的浏览器和计算机尝试此操作。
这个对我有用。
public ActionResult LogOff()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Login", "Account");
Response.Cookies.Clear();
FormsAuthentication.SignOut();
HttpCookie c = new HttpCookie("Login");
c.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(c);
Session.Clear();
}
和像 JavaScript 一样
function userLogOff() {
location.replace("/Account/LogOff");
}