Comment supprimer les cookies sur un site Web ASP.NET

87

Dans mon site Web, lorsque l'utilisateur clique sur le bouton "Déconnexion", la page Logout.aspx se charge avec le code Session.Clear().

Dans ASP.NET/C#, cela efface-t-il tous les cookies? Ou y a-t-il un autre code qui doit être ajouté pour supprimer tous les cookies de mon site Web?

fermer à clé
la source

Réponses:

149

Essayez quelque chose comme ça:

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

Mais il est également logique d'utiliser

Session.Abandon();

d'ailleurs dans de nombreux scénarios.

Kirill
la source
15
Session.Abandoneffacera le cookie de session ASP.NET, mais pas les cookies que vous avez définis manuellement, comme userID ici. Et Cookies["whatever"]n'est jamais nul; le framework créera un cookie si vous en demandez un inexistant.
Andomar le
11
@Andomar, Cookies["whatever"]renvoie en fait null lorsque le cookie n'existe pas! Je sais que c'est un vieux commentaire mais je ne veux pas que d'autres lecteurs soient induits en erreur par ce commentaire.
Nuno Agapito
6
Il est également très important de Expiresne PAS définir DateTime.MinValuece paramètre car cela donnera au cookie une expiration de session, ce qui signifie qu'il attend que le navigateur / l'onglet (dépendant du navigateur) soit fermé avant de supprimer le cookie.
Nashenas
7
@NunoAgapito Très ancien mais pour les autres utilisateurs, Cookies ["peu importe"] renvoie null si vous lisez depuis "Request" et retournez un cookie vide si vous lisez depuis "Response".
Athiwat Chunlakhan
mais cela ne supprime que le contenu du cookie, le cookie reste toujours dans le navigateur au moins pour moi
Beingnin
50

Non, les cookies ne peuvent être nettoyés qu'en définissant la date d'expiration pour chacun d'eux.

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

Au moment de Session.Clear():

  • Toutes les paires clé-valeur de la Sessioncollection sont supprimées. Session_Endl'événement ne se produit pas.

Si vous utilisez cette méthode lors de la déconnexion, vous devez également utiliser la Session.Abandonméthode to Session_Endevent:

  • Le cookie avec l'identifiant de session (si votre application utilise des cookies pour le stockage des identifiants de session, qui est par défaut) est supprimé
VMAtm
la source
Juste à propos de la date d'expiration, mais je pense que la ifligne ne fonctionne pas réellement. Lorsque vous demandez un cookie avec Cookies["whatever"]le framework va créer un cookie s'il n'existe pas.
Andomar le
@Andomar Ce code que j'ai obtenu de MSDN. Je ne pense pas que cela créera un cookie si nous appelons Requestobject.
VMAtm
2
Aha, on dirait que cela ne crée qu'un cookie pour l' Responseobjet. Intéressant :)
Andomar
3
Ce code peut être optimisé en une seule ligne Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Ici, le serveur demandera au navigateur de supprimer le cookie. Le navigateur le supprimera s'il existe.
shashwat
2
Oui, pour moi, j'avais besoin de la partie Response.Cookies.Add (myCookie) - sans elle, cela ne fonctionne pas toujours / correctement. Merci.
Christopher D.Emerson
28

Voici ce que j'utilise:

    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
la source
Merci beaucoup! Également débarrassé de mon problème que le cookie ne mettrait pas à jour côté serveur
Tom el Safadi
11

Malheureusement, pour moi, définir "Expire" ne fonctionnait pas toujours. Le cookie n'a pas été affecté.

Ce code a fonctionné pour moi:

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

"ASP.NET_SessionId"est le nom du cookie. Cela ne supprime pas vraiment le cookie, mais le remplace par un cookie vide, ce qui était assez proche pour moi.

Buh Buh
la source
5

Je tiens simplement à souligner que le cookie d'identification de session n'est pas supprimé lors de l'utilisation de Session.Abandon comme d'autres l'ont dit.

Lorsque vous abandonnez une session, le cookie d'identifiant de session n'est pas supprimé du navigateur de l'utilisateur. Par conséquent, dès que la session a été abandonnée, toute nouvelle demande adressée à la même application utilisera le même ID de session mais aura une nouvelle instance d'état de session. Dans le même temps, si l'utilisateur ouvre une autre application dans le même domaine DNS, l'utilisateur ne perdra pas son état de session après l'appel de la méthode Abandon à partir d'une application.

Parfois, vous ne souhaitez pas réutiliser l'ID de session. Si vous le faites et si vous comprenez les ramifications de la non-réutilisation de l'ID de session, utilisez l'exemple de code suivant pour abandonner une session et pour effacer le cookie d'ID de session:

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

Cet exemple de code efface l'état de session du serveur et définit le cookie d'état de session sur null. La valeur nulle efface effectivement le cookie du navigateur.

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

MT
la source
5

Nous sommes en 2018 maintenant, donc dans ASP.NET Core, il existe une fonction intégrée simple. Pour supprimer un cookie, essayez ce code:

if(Request.Cookies["aa"] != null)
{
    Response.Cookies.Delete("aa");
}
return View();
Dit Al Souti
la source
4

Vous ne devez jamais stocker le mot de passe sous forme de cookie. Pour supprimer un cookie, il vous suffit simplement de le modifier et de le faire expirer. Vous ne pouvez pas vraiment le supprimer, c'est-à-dire le supprimer du disque de l'utilisateur.

Voici un exemple:

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
la source
2

Prendre le titre de la question du PO comme suppression de tous les cookies - "Supprimer les cookies sur le site Web"

Je suis tombé quelque part sur le code de Dave Domagala sur le Web. J'ai modifié Dave's pour autoriser également les cookies Google Analytics - qui parcouraient tous les cookies trouvés sur le site Web et les supprimaient tous. (Du point de vue du développeur - mettre à jour un nouveau code dans un site existant est une bonne idée pour éviter les problèmes avec les utilisateurs revisitant le site)

J'utilise le code ci-dessous en tandem en lisant d'abord les cookies, en conservant toutes les données requises - puis en réinitialisant les cookies après avoir tout nettoyé avec la boucle ci-dessous.

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

Ajout: si vous utilisez Google Analytics

La boucle / suppression ci-dessus supprimera TOUS les cookies du site, donc si vous utilisez Google Analytics - il serait probablement utile de conserver le cookie __utmz car celui-ci garde une trace de l'origine du visiteur, du moteur de recherche utilisé, de quoi le lien a été cliqué, quel mot-clé a été utilisé et où ils se trouvaient dans le monde lorsque votre site Web a été consulté.

Donc, pour le garder, enveloppez une simple instruction if une fois que le nom du cookie est connu:

... 
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
la source
1

Bien que ce soit un vieux fil, je me suis dit que si quelqu'un cherchait toujours une solution à l'avenir.

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

C'est ce qui a fait l'affaire pour moi.

Ahsan
la source
0

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

Noman Chali
la source
0

Vous devez définir la date d'expiration pour supprimer les cookies

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

Cela ne lèvera pas d'exception si le cookie n'existe pas.

speyck
la source