OWIN - 注销MVC时删除cookie

时间:2016-02-22 09:30:56

标签: c# asp.net asp.net-mvc asp.net-mvc-4 cookies

我在用户注销时删除cookie时遇到的麻烦。

我正在学习MVC Asp.Net并且我已经创建了默认的MVC5应用程序。我已注册并使用帐户登录,一切正常。但是当我点击注销它正在工作时,它会将我重定向到主页,但它不会删除cookie。

我正在使用this扩展程序检查Cookie"编辑此Cookie"。

首先我登录然后使用EditThisCookie扩展名复制cookie,然后注销并删除co​​okie。现在,当我将复制的cookie粘贴到EditTshiCookie扩展中并刷新页面时,它会使用相同的帐户登录。 Cookie不会被删除。

LogOff方法

// POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        return RedirectToAction("Index", "Home");
    }

我已经this question

尝试了这个
Request.GetOwinContext().Authentication.SignOut();

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

3 个答案:

答案 0 :(得分:2)

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

  1. 登录应用程序会创建authcookie,其中包含有关用户身份验证和声明(权限)的信息。服务器会话或任何其他方式都没有写入任何内容。
  2. 在对登录cookie进行解码并验证用户是否仍在进行身份验证后的每个请求中。如果为true,则会对声明进行解码,以便稍后AuthorizeAttribute
  3. 使用它们
  4. 注销会从浏览器中删除该cookie,但如果您以任何方式保留该cookie并将其再次放入另一个请求中,那么owin将认为它仍然是经过身份验证且有效的用户。
  5. Session.Abandon无效,因为DefaultAuthenticationTypes.ApplicationCookie不是基于会话的。

    如果这不是所希望的行为。您可以向会话添加一些标记(IsAuthorized)并签入。Global.asax Application_PreRequestHandlerExecute然后重定向到登录表单。这样您就可以获得有关服务器和客户端的信息。但请记住,如果服务器会话状态失败(例如重启IIS),所有实际登录的用户都将被注销。

    有关基于Cookie的身份验证的更多信息link

答案 1 :(得分:0)

无论如何,回复很晚,试图减少无法回答的堆栈溢出负载。

要识别每个请求,服务器会为Web应用程序的每个用户分配一个唯一的会话ID 。服务器通过会话ID 识别用户。用户的服务器端会话在会话ID 上分配。将其视为下面的模型。

Session ID
 |---------------- Session 1
 |---------------- Session 2

(放弃cookie会话时,将从服务器中删除所有相关的.NET会话)

因此,当您从浏览器中删除会话cookie时,服务器不会识别请求并将其视为新请求,而且用户似乎已经注销。

但是,由于服务器尚未放弃/删除会话,如果您尝试在浏览器中再次使用复制的会话值,服务器将识别请求的会话ID 用户将再次登录。

你也可以尝试使用不同的浏览器和机器。

答案 2 :(得分:-1)

这个对我有用..

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");
}