Jak usunąć pliki cookie w witrynie ASP.NET

87

W mojej witrynie, gdy użytkownik kliknie przycisk „Wyloguj”, strona Logout.aspx ładuje się z kodem Session.Clear().

Czy w ASP.NET/C# powoduje to wyczyszczenie wszystkich plików cookie? Czy jest jakiś inny kod, który należy dodać, aby usunąć wszystkie pliki cookie z mojej witryny?

zamek
źródło

Odpowiedzi:

149

Spróbuj czegoś takiego:

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

Ale ma to również sens

Session.Abandon();

poza tym w wielu scenariuszach.

Kirill
źródło
15
Session.Abandonwyczyści plik cookie sesji ASP.NET, ale nie pliki cookie ustawione ręcznie, takie jak identyfikator użytkownika tutaj. I Cookies["whatever"]nigdy nie jest nieważne; framework utworzy plik cookie, jeśli poprosisz o nieistniejący plik.
Andomar,
11
@Andomar, faktycznie Cookies["whatever"]zwraca wartość null, gdy plik cookie nie istnieje! Wiem, że to stary komentarz, ale nie chcę, aby inni czytelnicy byli wprowadzani w błąd przez ten komentarz.
Nuno Agapito
6
Bardzo ważne Expiresjest również, aby NIE ustawić tego na, DateTime.MinValueponieważ w rzeczywistości spowoduje to wygaśnięcie sesji cookie, co oznacza, że ​​czeka, aż przeglądarka / karta (zależna od przeglądarki) zostanie zamknięta przed usunięciem pliku cookie.
Nashenas
7
@NunoAgapito Bardzo stary, ale dla innych użytkowników Cookies [„cokolwiek”] zwraca wartość null, jeśli czytasz „Żądanie”, i zwraca pusty plik cookie, jeśli czytasz „Odpowiedź”.
Athiwat Chunlakhan
ale to tylko usuwa zawartość z pliku cookie, plik cookie nadal pozostaje w przeglądarce przynajmniej dla mnie
Beingnin
50

Nie, pliki cookie można wyczyścić tylko poprzez ustawienie daty ważności dla każdego z nich.

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

W chwili obecnej Session.Clear():

  • Wszystkie pary klucz-wartość z Sessionkolekcji są usuwane. Session_Endwydarzenie się nie wydarzyło.

Jeśli korzystasz z tej metody podczas wylogowania, powinieneś również użyć Session.Abandonmetody do Session_Endzdarzenia:

  • Plik cookie z identyfikatorem sesji (jeśli Twoja aplikacja używa plików cookie do przechowywania identyfikatorów sesji, co jest domyślnie) jest usuwany
VMAtm
źródło
Dokładnie o dacie wygaśnięcia, ale uważam, że iflinia tak naprawdę nie działa. Kiedy poprosisz o plik cookie z Cookies["whatever"]frameworkiem, utworzy plik cookie, jeśli nie istnieje.
Andomar,
@Andomar Ten kod dostałem z MSDN. Nie sądzę, aby utworzył plik cookie, jeśli wywołasz Requestobiekt.
VMAtm,
2
Aha, wygląda na to, że tworzy tylko ciasteczko dla Responseobiektu. Ciekawe :)
Andomar
3
Ten kod można zoptymalizować tylko w jednej linii Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Tutaj serwer zażąda od przeglądarki usunięcia plików cookie. Przeglądarka usunie go, jeśli istnieje.
shashwat
2
Tak dla mnie potrzebowałem części Response.Cookies.Add (myCookie) - bez niej nie działa zawsze / poprawnie. Dzięki.
Christopher D. Emerson,
28

Oto czego używam:

    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();
        }
    }
bity pikseli
źródło
Dzięki wielkie! Pozbyłem się również mojego problemu, że plik cookie nie aktualizował się po stronie serwera
Tom el Safadi
11

Niestety dla mnie ustawienie „Expires” nie zawsze działało. Plik cookie pozostał nienaruszony.

Ten kod zadziałał dla mnie:

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

gdzie "ASP.NET_SessionId"jest nazwa pliku cookie. To tak naprawdę nie usuwa pliku cookie, ale zastępuje go pustym plikiem cookie, który był dla mnie wystarczająco blisko.

Buh Buh
źródło
5

Chcę tylko zaznaczyć, że plik cookie identyfikatora sesji nie jest usuwany podczas korzystania z Session.Abandon, jak powiedzieli inni.

Kiedy rezygnujesz z sesji, plik cookie z identyfikatorem sesji nie jest usuwany z przeglądarki użytkownika. Dlatego natychmiast po porzuceniu sesji wszelkie nowe żądania skierowane do tej samej aplikacji będą używać tego samego identyfikatora sesji, ale będą miały nową instancję stanu sesji. Jednocześnie, jeśli użytkownik otworzy inną aplikację w tej samej domenie DNS, nie utraci stanu sesji po wywołaniu metody Abandon z jednej aplikacji.

Czasami możesz nie chcieć ponownie używać identyfikatora sesji. Jeśli to zrobisz i jeśli rozumiesz konsekwencje niewykorzystania ponownie identyfikatora sesji, skorzystaj z następującego przykładu kodu, aby porzucić sesję i wyczyścić plik cookie z identyfikatorem sesji:

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

Ten przykład kodu czyści stan sesji z serwera i ustawia plik cookie stanu sesji na null. Wartość zerowa skutecznie usuwa plik cookie z przeglądarki.

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

MTs
źródło
5

Teraz jest rok 2018, więc w ASP.NET Core jest wbudowana prosta funkcja. Aby usunąć plik cookie, wypróbuj ten kod:

if(Request.Cookies["aa"] != null)
{
    Response.Cookies.Delete("aa");
}
return View();
Said Al Souti
źródło
4

Nigdy nie należy przechowywać hasła jako pliku cookie. Aby usunąć plik cookie, naprawdę wystarczy go zmodyfikować i wygaśnąć. Tak naprawdę nie można go usunąć, tj. Usunąć go z dysku użytkownika.

Oto próbka:

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
źródło
2

Biorąc tytuł pytania OP jako usunięcie wszystkich plików cookie - „Usuń pliki cookie ze strony internetowej”

Gdzieś w sieci natknąłem się na kod od Dave'a Domagali. Edytowałem Dave'a, aby zezwolić również na pliki cookie Google Analytics - które zapętlały wszystkie pliki cookie znalezione w witrynie i usuwały je wszystkie. (Z punktu widzenia programisty - aktualizacja nowego kodu do istniejącej witryny jest miłym akcentem, aby uniknąć problemów z ponownym odwiedzaniem witryny przez użytkowników).

Poniższy kod używam w tandemie z najpierw odczytywaniem ciasteczek, trzymaniem wszelkich wymaganych danych - a następnie resetowaniem ciasteczek po wyczyszczeniu wszystkiego za pomocą poniższej pętli.

Kod:

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

Dodatek: jeśli korzystasz z Google Analytics

Powyższe zapętlenie / usunięcie spowoduje usunięcie WSZYSTKICH ciasteczek ze strony, więc jeśli korzystasz z Google Analytics - prawdopodobnie przydałoby się zachować plik cookie __utmz, ponieważ ten śledzi, skąd przybył odwiedzający, z jakiej wyszukiwarki korzystała, co kliknięto łącze, jakie słowo kluczowe zostało użyte i gdzie się znajdowały na świecie, kiedy uzyskano dostęp do Twojej witryny.

Aby to zachować, zawiń proste oświadczenie if, gdy znana będzie nazwa pliku cookie:

... 
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
źródło
1

Chociaż to stary wątek, pomyślałem, że jeśli ktoś nadal szuka rozwiązania w przyszłości.

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

To właśnie pomogło mi.

Ahsan
źródło
0

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

Noman Chali
źródło
0

Aby usunąć pliki cookie, musisz ustawić datę wygaśnięcia

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

Nie spowoduje to zgłoszenia wyjątku, jeśli plik cookie nie istnieje.

speyck
źródło