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?

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.


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)

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

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


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


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

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
    }

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

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


0

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.