So löschen Sie Cookies auf einer ASP.NET-Website

86

Wenn der Benutzer auf meiner Website auf die Schaltfläche "Abmelden" klickt, wird die Seite "Logout.aspx" mit Code geladen Session.Clear().

Löscht dies in ASP.NET/C# alle Cookies? Oder muss ein anderer Code hinzugefügt werden, um alle Cookies meiner Website zu entfernen?

sperren
quelle

Antworten:

148

Versuchen Sie so etwas:

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

Es ist aber auch sinnvoll zu verwenden

Session.Abandon();

außerdem in vielen szenarien.

Kirill
quelle
15
Session.Abandonlöscht das ASP.NET-Sitzungscookie, jedoch keine manuell festgelegten Cookies, wie hier die Benutzer-ID. Und Cookies["whatever"]ist niemals null; Das Framework erstellt ein Cookie, wenn Sie nach einem nicht vorhandenen Cookie fragen.
Andomar
10
@Andomar, gibt tatsächlich Cookies["whatever"]null zurück, wenn das Cookie nicht existiert! Ich weiß, dass dies ein alter Kommentar ist, aber ich möchte nicht, dass andere Leser durch diesen Kommentar irregeführt werden.
Nuno Agapito
6
Es ist auch sehr wichtig, dass dies ExpiresNICHT festgelegt ist, DateTime.MinValueda dies dem Cookie tatsächlich einen Sitzungsablauf verleiht. Dies bedeutet, dass es wartet, bis der Browser / Tab (browserabhängig) geschlossen wird, bevor das Cookie gelöscht wird.
Nashenas
6
@NunoAgapito Sehr alt, aber für andere Benutzer geben Cookies ["was auch immer"] null zurück, wenn Sie aus "Request" lesen, und ein leeres Cookie, wenn Sie aus "Response" lesen.
Athiwat Chunlakhan
aber dies entfernt nur den Inhalt aus dem Cookie, der Cookie bleibt zumindest für mich immer noch im Browser
Nithin Chandran
50

Nein, Cookies können nur durch Festlegen des Ablaufdatums für jedes Cookie bereinigt werden.

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

Im Moment von Session.Clear():

  • Alle Schlüssel-Wert-Paare aus der SessionSammlung werden entfernt. Session_EndEreignis ist nicht geschehen.

Wenn Sie diese Methode beim Abmelden verwenden, sollten Sie auch die Session.AbandonMethode für Session_EndEreignisse verwenden:

  • Cookie mit Sitzungs-ID (wenn Ihre Anwendung standardmäßig Cookies für den Sitzungs-ID-Speicher verwendet) wird gelöscht
VMAtm
quelle
Richtig zum Ablaufdatum, aber ich glaube, die ifLeitung funktioniert nicht wirklich. Wenn Sie nach einem Cookie mit Cookies["whatever"]dem Framework fragen, wird ein Cookie erstellt, falls es nicht vorhanden ist.
Andomar
@Andomar Diesen Code habe ich von MSDN bekommen. Ich denke nicht, dass es ein Cookie erzeugt, wenn wir RequestObjekt aufrufen .
VMAtm
2
Aha, sieht so aus, als würde nur ein Cookie für das ResponseObjekt erstellt. Interessant :)
Andomar
3
Dieser Code kann nur in einer Zeile optimiert werden Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Hier fordert der Server den Browser auf, Cookies zu entfernen. Der Browser entfernt es, falls vorhanden.
Shashwat
2
Ja, für mich brauchte ich den Teil Response.Cookies.Add (myCookie) - ohne ihn funktioniert es nicht immer / richtig. Vielen Dank.
Christopher D. Emerson
27

Das benutze ich:

    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();
        }
    }
Pixelbits
quelle
Vielen Dank! Ich habe auch mein Problem beseitigt, dass das Cookie die Serverseite nicht aktualisieren würde
Tom el Safadi
11

Leider hat das Einstellen von "Expires" für mich nicht immer funktioniert. Der Cookie war nicht betroffen.

Dieser Code hat bei mir funktioniert:

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

Wo "ASP.NET_SessionId"ist der Name des Cookies? Dadurch wird das Cookie nicht wirklich gelöscht, sondern mit einem leeren Cookie überschrieben, das für mich nah genug war.

Buh Buh
quelle
5

Ich möchte nur darauf hinweisen, dass das Sitzungs-ID-Cookie bei Verwendung von Session.Abandon nicht entfernt wird, wie andere sagten.

Wenn Sie eine Sitzung abbrechen, wird das Sitzungs-ID-Cookie nicht aus dem Browser des Benutzers entfernt. Sobald die Sitzung abgebrochen wurde, verwenden alle neuen Anforderungen an dieselbe Anwendung dieselbe Sitzungs-ID, haben jedoch eine neue Sitzungsstatusinstanz. Wenn der Benutzer gleichzeitig eine andere Anwendung innerhalb derselben DNS-Domäne öffnet, verliert er nicht seinen Sitzungsstatus, nachdem die Abandon-Methode von einer Anwendung aufgerufen wurde.

Manchmal möchten Sie die Sitzungs-ID möglicherweise nicht wiederverwenden. Wenn Sie dies tun und die Auswirkungen der Nichtverwendung der Sitzungs-ID verstehen, verwenden Sie das folgende Codebeispiel, um eine Sitzung abzubrechen und das Sitzungs-ID-Cookie zu löschen:

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

In diesem Codebeispiel wird der Sitzungsstatus vom Server gelöscht und das Sitzungsstatus-Cookie auf null gesetzt. Der Nullwert löscht das Cookie effektiv aus dem Browser.

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

MTs
quelle
4

Sie sollten das Passwort niemals als Cookie speichern. Um ein Cookie zu löschen, müssen Sie es nur ändern und ablaufen lassen. Sie können es nicht wirklich löschen, dh von der Festplatte des Benutzers entfernen.

Hier ist ein Beispiel:

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
    }
Rajamohan Anguchamy
quelle
4

Es ist jetzt 2018, daher ist in ASP.NET Core eine einfache Funktion integriert. Um ein Cookie zu löschen, versuchen Sie diesen Code:

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

Nehmen Sie den Fragentitel des OP als Löschen aller Cookies - "Cookies in Website löschen"

Ich bin irgendwo im Internet auf Code von Dave Domagala gestoßen. Ich habe Dave's bearbeitet, um auch Google Analytics-Cookies zuzulassen. Dabei wurden alle auf der Website gefundenen Cookies durchlaufen und alle gelöscht. (Aus Entwicklersicht ist das Aktualisieren von neuem Code in eine vorhandene Site eine nette Geste, um Probleme mit Benutzern zu vermeiden, die die Site erneut besuchen.)

Ich verwende den folgenden Code zusammen mit dem Lesen der Cookies, dem Speichern aller erforderlichen Daten und dem Zurücksetzen der Cookies, nachdem ich alles mit der folgenden Schleife sauber gewaschen habe.

Der Code:

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.
}

Ergänzung: Wenn Sie Google Analytics verwenden

Die obige Schleife / Löschung löscht ALLE Cookies für die Website. Wenn Sie also Google Analytics verwenden, ist es wahrscheinlich nützlich, das __utmz-Cookie beizubehalten, da dieses Cookie verfolgt, woher der Besucher kam, welche Suchmaschine verwendet wurde, was Es wurde auf den Link geklickt, welches Schlüsselwort verwendet wurde und wo sie sich beim Zugriff auf Ihre Website auf der Welt befanden.

Um dies beizubehalten, schließen Sie eine einfache if-Anweisung ein, sobald der Cookie-Name bekannt ist:

... 
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);    
}
Martin Sansone - MiOEE
quelle
1

Obwohl dies ein alter Thread ist, dachte ich, wenn jemand in Zukunft noch nach einer Lösung sucht.

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

Das war der Trick für mich.

Ahsan
quelle
0

Response.Cookies ["UserSettings"]. Expires = DateTime.Now.AddDays (-1)

Noman Chali
quelle