OWIN - 注销 MVC 时删除 Cookie

本文关键字:删除 Cookie MVC 注销 OWIN | 更新日期: 2023-09-27 18:35:42

用户注销时,我在删除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);

OWIN - 注销 MVC 时删除 Cookie

您理解基于 cookie 的身份验证的方式是错误的:)

  1. 登录应用程序会创建 authcookie,其中包含有关用户身份验证和声明(权限)的信息。服务器会话中不会写入任何内容或以任何其他方式保留。
  2. 在登录后的每个请求中,cookie都会被解码并验证用户是否仍经过身份验证。如果为 true,它将解码声明,以便以后可以使用它们AuthorizeAttribute
  3. 注销会从浏览器中删除该 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");
}