Cómo eliminar las cookies en un sitio web ASP.NET

87

En mi sitio web, cuando el usuario hace clic en el botón "Cerrar sesión", la página Logout.aspx se carga con el código Session.Clear().

En ASP.NET/C#, ¿esto borra todas las cookies? ¿O hay algún otro código que deba agregarse para eliminar todas las cookies de mi sitio web?

bloquear
fuente

Respuestas:

149

Prueba algo como eso:

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

Pero también tiene sentido usar

Session.Abandon();

además en muchos escenarios.

Kirill
fuente
15
Session.Abandonborrará la cookie de sesión ASP.NET, pero no las cookies que establezca manualmente, como el ID de usuario aquí. Y Cookies["whatever"]nunca es nulo; el marco creará una cookie si solicita una que no existe.
Andomar
11
@Andomar, en realidad Cookies["whatever"]devuelve nulo cuando la cookie no existe. Sé que este es un comentario antiguo, pero no quiero que otros lectores se engañen con este comentario.
Nuno Agapito
6
También es muy importante que ExpiresNO esté configurado, DateTime.MinValueya que esto le dará a la cookie un vencimiento de sesión, lo que significa que espera hasta que el navegador / pestaña (dependiente del navegador) se cierre antes de eliminar la cookie.
Nashenas
7
@NunoAgapito Muy antiguo, pero para otros usuarios, Cookies ["lo que sea"] devuelve nulo si lee "Solicitud" y devuelve una cookie vacía si lee "Respuesta".
Athiwat Chunlakhan
pero esto solo elimina el contenido de la cookie, la cookie aún permanece en el navegador al menos para mí
Beingnin
50

No, las cookies solo se pueden limpiar configurando la fecha de vencimiento de cada una de ellas.

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

En el momento de Session.Clear():

  • SessionSe eliminan todos los pares clave-valor de la colección. Session_Endel evento no sucede.

Si usa este método durante el cierre de sesión, también debe usar el Session.Abandonmétodo para Session_Endeventos:

  • Se elimina la cookie con ID de sesión (si su aplicación utiliza cookies para almacenar el ID de sesión, que es la predeterminada)
VMAtm
fuente
Justo sobre la fecha de vencimiento, pero creo que la iflínea no funciona. Cuando solicite una cookie con Cookies["whatever"]el marco, se creará una cookie si no existe.
Andomar
@Andomar Este código lo obtuve de MSDN. No creo que cree una cookie si llamamos a Requestobject.
VMAtm
2
Ajá, parece que solo crea una cookie para el Responseobjeto. Interesante :)
Andomar
3
Este código se puede optimizar solo en una línea Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Aquí el servidor solicitará al navegador que elimine las cookies. El navegador lo eliminará si existe.
shashwat
2
Sí, para mí, necesitaba la parte Response.Cookies.Add (myCookie); sin ella, no funciona siempre / correctamente. Gracias.
Christopher D. Emerson
28

Esto es lo que 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();
        }
    }
pixelbits
fuente
¡Muchas gracias! También me deshice de mi problema de que la cookie no actualizaba el lado del servidor
Tom el Safadi
11

Desafortunadamente, para mí, configurar "Caduca" no siempre funcionó. La galleta no se vio afectada.

Este código funcionó para mí:

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

donde "ASP.NET_SessionId"es el nombre de la cookie. Esto realmente no elimina la cookie, pero la reemplaza con una cookie en blanco, que estaba lo suficientemente cerca para mí.

Buh Buh
fuente
5

Solo quiero señalar que la cookie de ID de sesión no se elimina cuando se usa Session.Abandon como dijeron otros.

Cuando abandona una sesión, la cookie de identificación de sesión no se elimina del navegador del usuario. Por lo tanto, tan pronto como se abandone la sesión, cualquier solicitud nueva a la misma aplicación usará el mismo ID de sesión pero tendrá una nueva instancia de estado de sesión. Al mismo tiempo, si el usuario abre otra aplicación dentro del mismo dominio DNS, el usuario no perderá su estado de sesión después de que se llame al método Abandon desde una aplicación.

A veces, es posible que no desee volver a utilizar el ID de sesión. Si lo hace y comprende las ramificaciones de no reutilizar el ID de sesión, utilice el siguiente ejemplo de código para abandonar una sesión y borrar la cookie de ID de sesión:

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

Este ejemplo de código borra el estado de la sesión del servidor y establece la cookie del estado de la sesión en nulo. El valor nulo borra efectivamente la cookie del navegador.

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

MT
fuente
5

Es 2018 ahora, por lo que en ASP.NET Core, hay una función integrada directa. Para eliminar una cookie, pruebe este código:

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

Nunca debe almacenar la contraseña como una cookie. Para eliminar una cookie, solo necesita modificarla y caducarla. Realmente no puede eliminarlo, es decir, eliminarlo del disco del usuario.

He aquí una muestra:

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
fuente
2

Tomar el título de la pregunta del OP como eliminar todas las cookies: "Eliminar cookies en el sitio web"

Encontré código de Dave Domagala en la web en algún lugar. Edité Dave's para permitir también las cookies de Google Analytics, que recorrieron todas las cookies que se encuentran en el sitio web y las eliminaron todas. (Desde el punto de vista del desarrollador, actualizar el código nuevo en un sitio existente es un buen toque para evitar problemas con los usuarios que vuelven a visitar el sitio).

Utilizo el siguiente código junto con leer las cookies primero, manteniendo los datos requeridos y luego restableciendo las cookies después de limpiar todo con el siguiente ciclo.

El código:

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

Además: si usa Google Analytics

El bucle / eliminación anterior eliminará TODAS las cookies del sitio, por lo que si usa Google Analytics, probablemente sería útil mantener la cookie __utmz ya que esta realiza un seguimiento de dónde vino el visitante, qué motor de búsqueda se usó, qué se hizo clic en el enlace, qué palabra clave se utilizó y en qué lugar del mundo se accedió a su sitio web.

Entonces, para mantenerlo, envuelva una declaración if simple una vez que se conozca el nombre de la 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
fuente
1

Aunque este es un hilo antiguo, pensé si alguien todavía está buscando una solución en el futuro.

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

Eso es lo que hizo el truco para mí.

Ahsan
fuente
0

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

Noman Chali
fuente
0

Tienes que configurar la fecha de caducidad para eliminar las cookies

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

Esto no generará una excepción si la cookie no existe.

Speyck
fuente