Como excluir cookies em um site ASP.NET

87

No meu site, quando o usuário clica no botão "Logout", a página Logout.aspx é carregada com o código Session.Clear().

No ASP.NET/C#, isso limpa todos os cookies? Ou existe algum outro código que precisa ser adicionado para remover todos os cookies do meu site?

fechadura
fonte

Respostas:

149

Experimente algo assim:

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

Mas também faz sentido usar

Session.Abandon();

além disso, em muitos cenários.

Kirill
fonte
15
Session.Abandonirá limpar o cookie de sessão ASP.NET, mas não os cookies que você definir manualmente, como o ID do usuário aqui. E Cookies["whatever"]nunca é nulo; o framework criará um cookie se você solicitar um não existente.
Andomar
11
@Andomar, na verdade Cookies["whatever"]retorna null quando o cookie não existe! Eu sei que este é um comentário antigo, mas não quero que outros leitores sejam enganados por este comentário.
Nuno Agapito
6
Também é muito importante que ExpiresNÃO seja definido DateTime.MinValuecomo, pois isso realmente dará ao cookie uma expiração de sessão, o que significa que ele aguarda até que o navegador / guia (dependente do navegador) seja fechado antes de excluir o cookie.
Nashenas
7
@NunoAgapito Muito antigo, mas para outros usuários, Cookies ["qualquer coisa"] retorna nulo se você ler em "Solicitar" e retornar um cookie vazio se ler em "Resposta".
Athiwat Chunlakhan
mas isso apenas remove o conteúdo do cookie, o cookie ainda permanece no navegador, pelo menos para mim
Beingnin
50

Não, os cookies podem ser limpos apenas definindo a data de expiração para cada um deles.

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

No momento de Session.Clear():

  • Todos os pares de valores-chave da Sessioncoleção são removidos. Session_Endevento não acontecer.

Se você usar este método durante o logout, também deverá usar o Session.Abandonmétodo para o Session_Endevento:

  • Cookie com ID de sessão (se seu aplicativo usa cookies para armazenamento de ID de sessão, que é por padrão) é excluído
VMAtm
fonte
Sobre a data de validade, mas acredito que a iflinha não funciona. Quando você pede um cookie com Cookies["whatever"]o framework irá criar um cookie se ele não existir.
Andomar
@Andomar Este código eu obtive do MSDN. Eu não acho que criará um cookie se chamarmos o Requestobjeto.
VMAtm
2
Aha, parece que só cria um cookie para o Responseobjeto. Interessante :)
Andomar
3
Este código pode ser otimizado em apenas uma linha Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Aqui, o servidor irá solicitar ao navegador para remover o cookie. O navegador irá removê-lo, se existir.
shashwat 01 de
2
Sim, para mim eu precisava da parte Response.Cookies.Add (myCookie) - sem ela não funciona sempre / corretamente. Obrigado.
Christopher D. Emerson
28

Isso é o que eu 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
fonte
Muito obrigado! Também me livrei do problema de que o cookie não atualizava o servidor
Tom el Safadi
11

Infelizmente, para mim, definir "Expires" nem sempre funcionou. O cookie não foi afetado.

Este código funcionou para mim:

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

onde "ASP.NET_SessionId"está o nome do cookie. Isso não exclui realmente o cookie, mas o substitui por um cookie em branco, que era próximo o suficiente para mim.

Buh Buh
fonte
5

Só quero salientar que o cookie de ID de sessão não é removido ao usar Session.Abandon como outros disseram.

Quando você abandona uma sessão, o cookie de ID da sessão não é removido do navegador do usuário. Portanto, assim que a sessão for abandonada, todas as novas solicitações para o mesmo aplicativo usarão o mesmo ID de sessão, mas terão uma nova instância de estado de sessão. Ao mesmo tempo, se o usuário abrir outro aplicativo dentro do mesmo domínio DNS, o usuário não perderá seu estado de sessão depois que o método Abandon for chamado de um aplicativo.

Às vezes, você pode não querer reutilizar o ID da sessão. Se você fizer isso e entender as ramificações de não reutilizar o ID da sessão, use o seguinte exemplo de código para abandonar uma sessão e limpar o cookie do ID da sessão:

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

Este exemplo de código limpa o estado da sessão do servidor e define o cookie de estado da sessão como nulo. O valor nulo limpa efetivamente o cookie do navegador.

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

MTs
fonte
5

Agora estamos em 2018, portanto, no ASP.NET Core, há uma função integrada direta. Para excluir um cookie, tente este código:

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

Você nunca deve armazenar a senha como um cookie. Para excluir um cookie, você realmente só precisa modificá-lo e expirá-lo. Você não pode realmente excluí-lo, ou seja, removê-lo do disco do usuário.

Aqui está um exemplo:

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

Considerando o título da Pergunta do OP como exclusão de todos os cookies - "Excluir Cookies do site"

Encontrei o código de Dave Domagala em algum lugar da web. Eu editei o de Dave para permitir cookies do Google Analytics também - que percorria todos os cookies encontrados no site e os excluía todos. (Do ponto de vista do desenvolvedor - atualizar o novo código em um site existente é um bom toque para evitar problemas com os usuários revisitando o site).

Eu uso o código abaixo junto com a leitura dos cookies primeiro, mantendo todos os dados necessários - em seguida, redefinindo os cookies depois de limpar tudo com o loop abaixo.

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

Adição: Se você usa o Google Analytics

O loop / exclusão acima excluirá TODOS os cookies do site, portanto, se você usar o Google Analytics - provavelmente seria útil manter o cookie __utmz, pois este mantém o controle de onde o visitante veio, qual mecanismo de pesquisa foi usado, o que o link foi clicado, qual palavra-chave foi usada e onde eles estavam no mundo quando seu site foi acessado.

Portanto, para mantê-lo, envolva uma instrução if simples assim que o nome do cookie for conhecido:

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

Embora este seja um tópico antigo, pensei se alguém ainda está procurando uma solução no futuro.

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

Isso é o que funcionou para mim.

Ahsan
fonte
0

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

Noman Chali
fonte
0

Você deve definir a data de validade para excluir os cookies

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

Isso não lançará uma exceção se o cookie não existir.

Speyck
fonte