Usando cookies em ASP.NET para restaurar seções

Veja neste artigo como funcionam os cookies, quando e como utilizá-los em aplicações ASP.NET. Conheça os benefícios e limitações do uso dessas estruturas em aplicações web.

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.

Figura 1. Os cookies na internet são um pouco diferentes

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;
Listagem 1. Estrutura de texto do Cookie

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" />
Listagem 2. Código da página aspx
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(); } } }
Listagem 3. Código C# – Code-Behind

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.

Referências

Artigos relacionados