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.

Os cookies na internet são um pouco diferentes
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