Come eliminare i cookie su un sito Web ASP.NET


87

Nel mio sito Web, quando l'utente fa clic sul pulsante "Logout", la pagina Logout.aspx viene caricata con il codice Session.Clear().

In ASP.NET/C#, vengono cancellati tutti i cookie? O c'è qualche altro codice che deve essere aggiunto per rimuovere tutti i cookie del mio sito web?

Risposte:


149

Prova qualcosa del genere:

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

Ma ha anche senso usare

Session.Abandon();

inoltre in molti scenari.


15
Session.Abandoncancellerà il cookie di sessione ASP.NET, ma non i cookie impostati manualmente, come l'ID utente qui. E Cookies["whatever"]non è mai nullo; il framework creerà un cookie se ne chiedi uno inesistente.
Andomar

11
@Andomar, in realtà Cookies["whatever"]restituisce null quando il cookie non esiste! So che questo è un vecchio commento ma non voglio che altri lettori siano fuorviati da questo commento.
Nuno Agapito

6
È anche molto importante che ExpiresNON sia impostato in DateTime.MinValuequanto ciò darà effettivamente al cookie una scadenza di sessione, il che significa che attende fino a quando il browser / scheda (dipendente dal browser) viene chiuso prima di eliminare il cookie.
Nashenas

7
@NunoAgapito Molto vecchio ma per altri utenti, Cookies ["qualunque"] restituisce null se leggi da "Request" e restituisce un cookie vuoto se leggi da "Response".
Athiwat Chunlakhan

ma questo rimuove solo il contenuto dal cookie, il cookie rimane ancora nel browser almeno per me
Beingnin

50

No, i cookie possono essere puliti solo impostando la data di scadenza per ciascuno di essi.

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

Al momento di Session.Clear():

  • Tutte le coppie chiave-valore dalla Sessionraccolta vengono rimosse. Session_Endevento non è accaduto.

Se utilizzi questo metodo durante il logout, dovresti utilizzare anche il Session.Abandonmetodo per l' Session_Endevento:

  • Il cookie con ID sessione (se l'applicazione utilizza i cookie per l'archivio ID sessione, che è per impostazione predefinita) viene eliminato

Giusto sulla data di scadenza, ma credo che la iflinea non funzioni effettivamente. Quando chiedi un cookie con Cookies["whatever"]il framework creerà un cookie se non esiste.
Andomar

@Andomar Questo codice l'ho ricevuto da MSDN. Non penso che creerà un cookie se chiamiamo Requestobject.
VMAtm

2
Aha, sembra che crei solo un cookie per l' Responseoggetto. Interessante :)
Andomar

3
Questo codice può essere ottimizzato solo in una riga Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Qui il server richiederà al browser di rimuovere i cookie. Il browser lo rimuoverà se esiste.
shashwat

2
Sì, per me avevo bisogno della parte Response.Cookies.Add (myCookie) - senza di essa non funziona sempre / correttamente. Grazie.
Christopher D. Emerson,

28

Questo è quello che uso:

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

Grazie mille! Inoltre ho eliminato il mio problema che il cookie non aggiornava il lato server
Tom el Safadi

11

Sfortunatamente, per me, l'impostazione "Expires" non ha sempre funzionato. Il cookie è rimasto inalterato.

Questo codice ha funzionato per me:

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

dov'è "ASP.NET_SessionId"il nome del cookie. Questo non elimina realmente il cookie, ma lo sostituisce con un cookie vuoto, che era abbastanza vicino per me.


5

Voglio solo sottolineare che il cookie ID sessione non viene rimosso quando si utilizza Session.Abandon come altri hanno detto.

Quando si abbandona una sessione, il cookie dell'ID di sessione non viene rimosso dal browser dell'utente. Pertanto, non appena la sessione è stata abbandonata, tutte le nuove richieste alla stessa applicazione utilizzeranno lo stesso ID sessione ma avranno una nuova istanza dello stato della sessione. Allo stesso tempo, se l'utente apre un'altra applicazione all'interno dello stesso dominio DNS, l'utente non perderà il proprio stato di sessione dopo che il metodo Abandon viene chiamato da un'applicazione.

A volte, potresti non voler riutilizzare l'ID di sessione. Se lo fai e se comprendi le conseguenze del non riutilizzo dell'ID di sessione, utilizza il seguente esempio di codice per abbandonare una sessione e cancellare il cookie dell'ID di sessione:

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

Questo esempio di codice cancella lo stato della sessione dal server e imposta il cookie dello stato della sessione su null. Il valore null cancella efficacemente il cookie dal browser.

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


5

È il 2018 ora, quindi in ASP.NET Core è disponibile una funzione incorporata semplice. Per eliminare un cookie prova questo codice:

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

4

Non dovresti mai memorizzare la password come cookie. Per eliminare un cookie, devi solo modificarlo e farlo scadere. Non puoi davvero cancellarlo, cioè rimuoverlo dal disco dell'utente.

Ecco un esempio:

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

Considerando il titolo della domanda dell'OP come eliminare tutti i cookie - "Elimina cookie nel sito Web"

Mi sono imbattuto in codice da Dave Domagala sul web da qualche parte. Ho modificato Dave's per consentire anche i cookie di Google Analytics, che ha eseguito il loop di tutti i cookie trovati sul sito Web e li ha eliminati tutti. (Dal punto di vista dello sviluppatore, aggiornare il nuovo codice in un sito esistente è un bel tocco per evitare problemi con gli utenti che rivisitano il sito).

Uso il codice seguente insieme alla lettura dei cookie prima, conservando tutti i dati richiesti, quindi reimpostando i cookie dopo aver pulito tutto con il ciclo sottostante.

Il codice:

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

Aggiunta: se utilizzi Google Analytics

Il ciclo / cancellazione di cui sopra cancellerà TUTTI i cookie per il sito, quindi se utilizzi Google Analytics, sarebbe probabilmente utile trattenere il cookie __utmz poiché questo tiene traccia della provenienza del visitatore, quale motore di ricerca è stato utilizzato, cosa è stato fatto clic sul collegamento, quale parola chiave è stata utilizzata e dove si trovavano nel mondo quando è stato effettuato l'accesso al tuo sito web.

Quindi, per mantenerlo, racchiudi una semplice istruzione if una volta che il nome del cookie è noto:

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

Anche se questo è un vecchio thread, ho pensato se qualcuno sta ancora cercando una soluzione in futuro.

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

Questo è ciò che ha funzionato per me.


0

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


0

È necessario impostare la data di scadenza per eliminare i cookie

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

Questo non genererà un'eccezione se il cookie non esiste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.