如何在ASP.NET网站上删除Cookie


87

在我的网站上,当用户单击“注销”按钮时,Logout.aspx页面将加载代码Session.Clear()

在ASP.NET/C#中,这会清除所有cookie吗?还是需要添加任何其他代码来删除我网站的所有cookie?

Answers:


149

尝试这样的事情:

if (Request.Cookies["userId"] != null)
{
    Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);   
}

但这也很有意义

Session.Abandon();

除了在许多情况下。


15
Session.Abandon将清除ASP.NET会话cookie,但不会清除您手动设置的cookie,例如此处的userID。而且Cookies["whatever"]永远不会为空;如果您要求一个不存在的cookie,框架将创建一个cookie。
2011年

11
@Andomar,Cookies["whatever"]当cookie不存在时实际上返回null!我知道这是一个旧评论,但我不希望其他读者被此评论误导。
Nuno Agapito 2014年

6
同样重要的Expires是,不要将其设置为,DateTime.MinValue因为这实际上会使cookie的Session期满,这意味着它要等到浏览器/选项卡(与浏览器相关)关闭后才能删除cookie。
Nashenas

7
@NunoAgapito很老,但对于其他用户,如果从“请求”中读取,则Cookies [“ whatever”]返回null;如果从“响应”中读取,则返回空cookie。
Athiwat Chunlakhan

但这只会从cookie中删除内容,至少对于我来说,cookie仍然保留在浏览器中
Beinnin'Oct11''17

50

不可以,只有通过设置每个Cookie的到期日期才能清除它们。

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

目前Session.Clear()

  • Session集合中的所有键值对均已删除。Session_End事件没有发生。

如果您在注销期间使用此方法,则还应该使用该Session.Abandon方法来 Session_End发生事件:

  • 删除具有会话ID的Cookie(如果您的应用程序将cookie用于会话ID存储,默认情况下)

即将到期,但是我相信这if条线实际上是行不通的。当您使用Cookies["whatever"]框架请求cookie时,如果它不存在,则会创建一个cookie。
2011年

@Andomar这段代码是我从MSDN获得的。我认为如果我们调用Request对象,它不会创建一个cookie 。
VMAtm 2011年

2
嗯,看起来它只为该Response对象创建了一个cookie 。有趣的:)
Andomar

3
只需一行即可优化此代码Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)。服务器将在此处请求浏览器删除Cookie。浏览器将删除它(如果存在)。
shashwat 2013年

2
是的,对我来说,我需要Response.Cookies.Add(myCookie)部分-没有它,它将无法始终/正确地工作。谢谢。
Christopher D. Emerson's

28

这是我用的:

    private void ExpireAllCookies()
    {
        if (HttpContext.Current != null)
        {
            int cookieCount = HttpContext.Current.Request.Cookies.Count;
            for (var i = 0; i < cookieCount; i++)
            {
                var cookie = HttpContext.Current.Request.Cookies[i];
                if (cookie != null)
                {
                    var expiredCookie = new HttpCookie(cookie.Name) {
                        Expires = DateTime.Now.AddDays(-1),
                        Domain = cookie.Domain
                    };
                    HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it
                }
            }

            // clear cookies server side
            HttpContext.Current.Request.Cookies.Clear();
        }
    }

非常感谢!也摆脱了我的问题,即cookie无法更新服务器端
Tom el Safadi,

11

不幸的是,对我来说,设置“ Expires”并不总是有效。Cookie不受影响。

这段代码确实为我工作:

HttpContext.Current.Session.Abandon();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

"ASP.NET_SessionId"Cookie的名称在哪里。这实际上并不会删除cookie,而是用一个空白cookie覆盖它,该cookie对我来说足够近了。


5

我只想指出,如其他人所述,使用Session.Abandon时不会删除Session ID cookie。

放弃会话时,不会从用户的浏览器中删除会话ID cookie。因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话ID,但将具有新的会话状态实例。同时,如果用户在同一DNS域中打开另一个应用程序,则从一个应用程序调用Abandon方法后,用户将不会丢失其会话状态。

有时,您可能不想重复使用会话ID。如果这样做,并且您了解不重新使用会话ID的后果,请使用以下代码示例放弃会话并清除会话ID cookie:

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

此代码示例从服务器清除会话状态,并将会话状态cookie设置为null。null值有效地从浏览器清除cookie。

http://support.microsoft.com/kb/899918


5

现在是2018年,因此在ASP.NET Core中有一个简单的内置函数。要删除Cookie,请尝试以下代码:

if(Request.Cookies["aa"] != null)
{
    Response.Cookies.Delete("aa");
}
return View();

4

您永远不应将密码存储为cookie。要删除Cookie,您实际上只需要对其进行修改并使其过期。您不能真正删除它,即,将其从用户磁盘中删除。

这是一个示例:

HttpCookie aCookie;
    string cookieName;
    int limit = Request.Cookies.Count;
    for (int i=0; i<limit; i++)
    {
        cookieName = Request.Cookies[i].Name;
        aCookie = new HttpCookie(cookieName);
        aCookie.Expires = DateTime.Now.AddDays(-1); // make it expire yesterday
        Response.Cookies.Add(aCookie); // overwrite it
    }

2

以OP的问题标题作为删除所有cookie的“在网站上删除Cookies”

我在网上某处遇到了Dave Domagala的代码。我编辑了Dave,也允许使用Google Analytics(分析)Cookie-遍历网站上找到的所有Cookie并将其全部删除。(从开发人员的角度出发-将新代码更新到现有网站中是避免用户重新访问该网站的问题的一种不错的选择)。

我结合使用以下代码,首先读取cookie,保存所有必需的数据-然后在使用以下循环将所有内容清洗干净后重置cookie。

编码:

int limit = Request.Cookies.Count; //Get the number of cookies and 
                                   //use that as the limit.
HttpCookie aCookie;   //Instantiate a cookie placeholder
string cookieName;   

//Loop through the cookies
for(int i = 0; i < limit; i++)
{
 cookieName = Request.Cookies[i].Name;    //get the name of the current cookie
 aCookie = new HttpCookie(cookieName);    //create a new cookie with the same
                                          // name as the one you're deleting
 aCookie.Value = "";    //set a blank value to the cookie 
 aCookie.Expires = DateTime.Now.AddDays(-1);    //Setting the expiration date
                                                //in the past deletes the cookie

 Response.Cookies.Add(aCookie);    //Set the cookie to delete it.
}

另外:如果您使用Google Analytics(分析)

上面的循环/删除操作将删除该网站的所有cookie,因此,如果您使用Google Analytics(分析)-保留__utmz cookie可能会很有用,因为它可以跟踪访问者来自何处,使用了什么搜索引擎,使用了什么内容。单击链接,使用了什么关键字以及访问您的网站时它们在世界上的位置。

因此,要保留它,请在知道cookie名称后包装一个简单的if语句:

... 
aCookie = new HttpCookie(cookieName);    
if (aCookie.Name != "__utmz")
{
    aCookie.Value = "";    //set a blank value to the cookie 
    aCookie.Expires = DateTime.Now.AddDays(-1);   

    HttpContext.Current.Response.Cookies.Add(aCookie);    
}

1

虽然这是一个老话题,但我想如果将来有人还在寻找解决方案。

HttpCookie mycookie = new HttpCookie("aa");
mycookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(mycookie1);

那就是我的诀窍。



0

您必须设置到期日期才能删除Cookie

Request.Cookies[yourCookie]?.Expires.Equals(DateTime.Now.AddYears(-1));

当cookie不存在时,这不会引发异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.