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?
Session.Abandon
irá limpar o cookie de sessão ASP.NET, mas não os cookies que você definir manualmente, como o ID do usuário aqui. ECookies["whatever"]
nunca é nulo; o framework criará um cookie se você solicitar um não existente.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.Expires
NÃO seja definidoDateTime.MinValue
como, 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.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()
:Session
coleção são removidos.Session_End
evento não acontecer.Se você usar este método durante o logout, também deverá usar o
Session.Abandon
método para oSession_End
evento:fonte
if
linha não funciona. Quando você pede um cookie comCookies["whatever"]
o framework irá criar um cookie se ele não existir.Request
objeto.Response
objeto. Interessante :)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.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(); } }
fonte
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.fonte
Só quero salientar que o cookie de ID de sessão não é removido ao usar Session.Abandon como outros disseram.
http://support.microsoft.com/kb/899918
fonte
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();
fonte
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 }
fonte
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); }
fonte
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.
fonte
Response.Cookies ["UserSettings"]. Expires = DateTime.Now.AddDays (-1)
fonte
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.
fonte