web-dev-qa-db-fra.com

Comment effacer les cookies en utilisant asp.net mvc 3 et c #?

Ok, donc je pense vraiment que je fais ça correctement, mais les cookies ne sont pas effacés.

 Session.Clear();
 HttpCookie c = Request.Cookies["MyCookie"];
 if (c != null)
 {
     c = new HttpCookie("MyCookie");
     c["AT"] = null;
     c.Expires = DateTime.Now.AddDays(-1);
     Request.Cookies.Add(c);
 }

 return RedirectToAction("Index", "Home");

Lorsque la redirection se produit, il retrouve le cookie et continue comme si je ne me suis jamais déconnecté. Des pensées?

54
David

Tu es proche. Vous devrez utiliser l'objet Response pour réécrire dans le navigateur:

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

Plus d'informations sur MSDN, Comment: supprimer un cookie .

104
Metro Smurf

Les cookies sont stockés sur le client, pas sur le serveur, donc Session.Clear ne les affectera pas. En outre, Request.Cookies est rempli par IIS et donné à votre page avec chaque demande de page; l'ajout/la suppression d'un cookie de cette collection ne fait rien.

Essayez d'effectuer une action similaire contre Response.Cookies. Cela devrait amener votre client à remplacer l'ancien cookie par le nouveau, ce qui entraînera son expiration.

9
KeithS

J'ai fait cela et cela a fonctionné pour effacer (pas supprimer) un cookie de session:

HttpContext.Response.Cookies.Set(new HttpCookie("cookie_name"){Value = string.Empty});

Sur la base de la réponse de Metro, j'ai créé cette méthode d'extension pour rendre le code réutilisable dans n'importe quel contrôleur.

/// <summary>
/// Deletes a cookie with specified name
/// </summary>
/// <param name="controller">extends the controller</param>
/// <param name="cookieName">cookie name</param>
public static void DeleteCookie(this Controller controller, string cookieName)
{
    if (controller.HttpContext.Request.Cookies[cookieName] == null)
            return; //cookie doesn't exist

    var c = new HttpCookie(cookieName)
                {
                    Expires = DateTime.Now.AddDays(-1)
                };
    controller.HttpContext.Response.Cookies.Add(c);
}
4
Alex