A utilização de cookies no ASP.Net não é muito difundida graças as facilidades de criar e gerir as sessões do sistema com o provedor (IIS). As sessões são onde muita gente guarda as informações do usuário e a mesma é mantida ativa enquanto o usuário navega.

Toda sessão tem como default, definido pelo provedor IIS, o tempo limite de vida de 20 minutos, após esse tempo de ociosidade, a sessão automaticamente é fechada e o canal com o provedor é cancelado.
Após uma nova requisição do usuário, alguns sistemas devem forçar o preenchimento novamente do usuário e senha, pois por necessidades de negócio o mesmo deverá ter permissões de entrada para navegar e trabalhar.
Após o fechamento do canal de conversa entre o sistema e o provedor, não é mais possível recuperar o estado original da sessão, pois ela deixa de existir literalmente.
Então entra na jogada outro artifício, dentre diversos, para que seja possível revalidar o estado do usuário e sua sessão sem exigir qualquer intervenção do usuário.
Muitos desenvolvedores têm certa inflexibilidade quando o assunto de Cookie entra, pois o mesmo exibe certos riscos de segurança, as informações de cookie são mantidas no cliente e pessoas maliciosas podem aproveitar-se e roubar informações alheias e ter o acesso indevido as informações.
Por isso devemos utilizar o cookie de modo que ele seja apenas um “revalidador” automático da sessão do usuário e não um armazenador de informações cruciais, como senha do usuário, informações de endereço entre outras.
Como Funciona o Cookie
Um cookie possui informações puras em textos no formato ‘Nome-Valor’. São geralmente informações não confidenciais utilizadas por sites que aderem a um formato mais amigável com seus usuários.
Como por exemplo: sites de e-commerce sempre irão dar as boas vindas quando você retornar e até mesmo produtos em carrinho que há dias você incluiu.
O site ou sistema inclui no seu computador estas informações a qualquer momento que achar mais propício, sendo no seu login, ou apenas no acesso a uma noticia na busca de um produto (Google).
Estes cookies ficam em diretórios definidos para cada Browser. O desenvolvedor que criá-los pode definir o tempo que o cookie se manterá ativo na sua máquina. Passando do tempo estipulado, o cookie se torna inválido.
Cuidado com as Limitações
O cookie é bem limitado em todos os aspectos, por isso mesmo ele trafega no protocolo HTTP sem criptografias.
Atente que a dimensão de um cookie não pode ultrapassar (e nem vai) a um total de 4 Kb.
Cada domínio (site que cria) tem a permissão de criar até no máximo 20 cookies por cliente, portanto entenda que a reutilização do cookie existente é primordial.
Segundo a Microsoft e dentro de convenções de padrões internacionais, um cliente pode ter até 300 cookies na sua máquina.
Chave Nome-Valor
O cookie, por ser uma parte tão importante de um site como em e-commerce ou demais sites, logo se imagina que o mesmo ocupe grande espaço físico, certo?
Errado, a estrutura de um cookie é levíssima, isso por que o mesmo possui apenas texto seguido de texto, assim como é uma resposta de uma requisição que retorna Json. Puro texto organizado em chaves e nome-valor.
A estrutura de texto do cookie é simples:
Nome=Valor; Nome2=Valor2; NomeN=ValorN;
Porém, sempre que o cookie é enviado para o cliente, outras informações cruciais são passadas, como o tempo de expiração (Expires). Seguindo a linha temos o path, responsável por informar um subdiretório para o cookie, o qual limita a utilização do cookie apenas para uma parte do sistema. O domain por default é assinado automaticamente, entretanto é possível informar o domínio, desde que siga a nomenclatura do nome corretamente. E finalizando, o secure, responsável por especificar um protocolo seguro para o tráfego das informações do cookie, sendo SSL ou S-HTTP.
Atributos |
---|
Nome do Cookie |
Expires |
Domain |
Path |
Secure |
Codificar
A seguir temos um exemplo prático de uso de cookies. Primeiramente temos o código de parte da página aspx e, em seguida, o código C# responsável pela manipulação dos cookies na prática.
HasUser:<asp:Label runat="server" ID="lblHasUser"></asp:Label>
<br />
<fieldset>
<legend>Informações do Cookie</legend>
User:<asp:Label runat="server" ID="lblUser"></asp:Label>
<br />
Domain:<asp:Label runat="server" ID="lblDomain"></asp:Label>
<br />
Path:<asp:Label runat="server" ID="lblPath"></asp:Label>
<br />
Secure:<asp:Label runat="server" ID="lblSecure"></asp:Label>
<br />
Expires:<asp:Label runat="server" ID="lblExpires"></asp:Label>
</fieldset>
<asp:Button runat="server" ID="btnEntrar" Text="Entrar"
onclick="btnEntrar_Click" />
using System;
using System.Web;
namespace UsingCookieSession
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (Session["user"] == null && Request.Cookies["user"] == null)
{
lblHasUser.Text = "Usuário Não Encontrado";
return;
}
else if (Session["user"] == null)
{
ReadCookies();
}
SetFormInformation();
}
private void SetFormInformation()
{
if (Request.Cookies["user"] == null && Session["user"] != null)
WriteCookies();
var cookieInfo = Request.Cookies["user"];
lblHasUser.Text = (cookieInfo != null).ToString();
lblUser.Text = cookieInfo.Value;
lblDomain.Text = cookieInfo.Domain;
lblExpires.Text = cookieInfo.Expires.ToLongDateString() + " - " +
cookieInfo.Expires.ToLongTimeString();
lblPath.Text = cookieInfo.Path;
lblSecure.Text = cookieInfo.Secure.ToString();
}
private void ReadCookies()
{
foreach (var cookie in Request.Cookies)
{
if (ReferenceEquals(cookie, "user"))
{
Session["user"] = Request.Cookies[cookie.ToString()].Value;
break;
}
}
}
private void WriteCookies()
{
var newCookie = new HttpCookie("user");
newCookie.Value = Session["user"].ToString();
newCookie.Expires = DateTime.Now.AddMinutes(20); //Expira em 20 minutos.
newCookie.Domain = "devmedia.com.br"; //Comente Para funcionar Local
newCookie.Path = "/devMedia"; //Comente Para funcionar Local
newCookie.Secure = true; //Comente Para funcionar Local
Response.Cookies.Add(newCookie);
}
protected void btnEntrar_Click(object sender, EventArgs e)
{
Session["user"] = "Robson Alves";
WriteCookies();
SetFormInformation();
}
}
}
Conclusões
O código é bastante simples, muitas outras validações ainda podem e devem ser realizadas.
Coloque apenas o essencial no cookie, não coloque nada confidencial ou primordial, apenas uma bandeira de revalidação.
Atentem-se também as limitações do cookie, isso é importante para tratar futuros problemas incubados.
Espero que gostem e não deixem de pesquisar sobre o assunto.