2011-02-25 44 views
49

好吧,所以我真的认为我正在做这件事,但饼干没有被清除。如何使用asp.net mvc 3和c#清除cookie?

Session.Clear(); 
HttpCookie c = Request.Cookies["MyCookie"]; 
if (c != null) 
{ 
    c = new HttpCookie("MyCookie"); 
    c["AT"] = null; 
    c.Expires = DateTime.Now.AddDays(-1); 
    Request.Cookies.Add(c); 
} 

return RedirectToAction("Index", "Home"); 

当重定向发生时,再次发现的cookie和好像我从来没有退出移动上。有什么想法吗?

回答

96

你很近。你需要使用Response对象写回浏览器:在MSDN上,How to: Delete a Cookie

if (Request.Cookies["MyCookie"] != null) 
{ 
    var c = new HttpCookie("MyCookie"); 
    c.Expires = DateTime.Now.AddDays(-1); 
    Response.Cookies.Add(c); 
} 

更多信息。

+7

Bah!不能相信我得到了回应和请求混淆。 感谢您的帮助! David – David 2011-02-25 21:14:18

+0

2017年有什么新东西? – 2017-07-22 06:12:21

+1

@VikasRana现在自驾车是一件大事。 – 2017-09-25 12:28:20

9

Cookie存储在客户端,而不是服务器上,因此Session.Clear不会影响它们。此外,Request.Cookies由IIS填充,并在每次请求页面时将其提供给页面;添加/删除该集合中的一个cookie什么也不做。

尝试对Response.Cookies执行类似操作。这会导致你的客户用新的cookie覆盖旧的cookie,导致它过期。

4

我这样做,它的工作清除(不删除)会话cookie:

HttpContext.Response.Cookies.Set(new HttpCookie("cookie_name"){Value = string.Empty}); 

基于地铁的回应我创造了这个扩展方法,使在任何控制器的代码重用。

/// <summary> 
/// Deletes a cookie with specified name 
/// </summary> 
/// <param name="controller">extends the controller</param> 
/// <param name="cookieName">cookie name</param> 
public static void DeleteCookie(this Controller controller, string cookieName) 
{ 
    if (controller.HttpContext.Request.Cookies[cookieName] == null) 
      return; //cookie doesn't exist 

    var c = new HttpCookie(cookieName) 
       { 
        Expires = DateTime.Now.AddDays(-1) 
       }; 
    controller.HttpContext.Response.Cookies.Add(c); 
} 
+0

尝试了几件事情,只有拥有AuthorizationContext,并且您的解决方案终于可以工作 – CodingYourLife 2014-12-22 01:47:47