Criando uma sessão de login permanente em .NET

Aprenda a evitar o login temporário no gerenciamento de sessão das suas aplicações web.

Por padrão, a maioria das plataformas de desenvolvimento web configuram as aplicações de modo a permitir que o usuário fique logado apenas por um determinado tempo e, após esse período, o mesmo é automaticamente desconectado. Todavia, existem alguns cenários em que precisamos exatamente do oposto: um login permanente que jamais desconecta, como em aplicações de e-mails, armazenamento de arquivos na nuvem, ou quando temos uma aplicação de intranet que exige essa funcionalidade. Ao ler este artigo, você conseguirá criar uma sessão permanente de login e poderá usar essa técnica em qualquer tipo de projeto .NET.

Passo 1: Formulários de autenticação

Num projeto web .NET, toda configuração que se refere à autenticação de formulário é feita no arquivo web.config, cujos valores padrão são apresentados na Listagem 1. É a partir dele que se torna possível criar um “login ilimitado” e configurar a autenticação de acordo com nossas necessidades.

Listagem 1. Configuração de autenticação de formulários

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" 
           protection="All" 
           timeout="1" 
           name=".CONTROLELOGINUSUARIO" 
           path="/" 
           requireSSL="false" 
           slidingExpiration="true" 
           defaultUrl="~/Home/Index" 
          cookieless="UseDeviceProfile" 
          enableCrossAppRedirects="false" /></authentication>

      

Passo 2: Modificando o tipo de autenticação

O único meio que dispomos de compartilhar uma sessão de usuário entre o navegador e o servidor de forma permanente, é através dos cookies. Em função disso, criaremos uma classe que ajudará com tal lógica interceptando a requisição de login que chegar à aplicação. Na Listagem 2 apresentamos o código da classe CookieHelper, cujo papel principal será configurar o cookie de autenticação permanente do usuário na aplicação. Como podemos notar, essa classe conta com um construtor que recebe o objeto HTTP response – que usaremos para modificar os dados dos cookies no fluxo do login – e o método principal SetLoginCookie(), que recebe três parâmetros: userName, password e isPermanentCookie, utilizado para ativar/desativar o recurso de login permanente.

Listagem 2. Criando um CookieHelper

public sealed class CookieHelper
{
    private HttpResponseBase _response;
 
    public CookieHelper(HttpResponseBase response)
    {
        _response = response;
    }
 
    public void SetLoginCookie(string userName, string password, bool isPermanentCookie)
    {
        if (_response != null)
        {
            if (isPermanentCookie)
            {
                FormsAuthenticationTicket userAuthTicket = new FormsAuthenticationTicket(
                           1, 
                           userName, 
                           DateTime.Now, 
                           DateTime.MaxValue, 
                           true, 
                           password, 
                           FormsAuthentication.FormsCookiePath);
 
                string encUserAuthTicket = FormsAuthentication.Encrypt(userAuthTicket);
                HttpCookie userAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encUserAuthTicket);
                if (userAuthTicket.IsPersistent) userAuthCookie.Expires = userAuthTicket.Expiration;
 
                userAuthCookie.Path = FormsAuthentication.FormsCookiePath;
                _response.Cookies.Add(userAuthCookie);
            }
            else
            {
                FormsAuthentication.SetAuthCookie(userName, isPermanentCookie);
            }
        }
    }
}

      

Passo 3: Concluindo a autenticação permanente

Para testar a implementação, a Listagem 3 traz um método de exemplo que pode ser chamado após o clique do botão login. Uma vez que o login do usuário tenha sido efetuado com sucesso, criamos um objeto do tipo CookieHelper (linha 4) e chamamos seu método SetLoginCookie() passando os dados do usuário, a senha e o booleano de sessão permanente. Dessa forma, a API do .NET removerá o timeout padrão e, a cada nova requisição, verificará se os dados de autenticação se encontram no cookie autorizando, assim, o usuário.

Listagem 3. Validação do login do usuário

private bool Login(string username, string password, bool rememberMe) {
    bool isUserValid = // Lógica específica para verificar login do usuário
    if (isUserValid) { // Se o usuário autenticar com sucesso
        CookieHelper newCookieHelper = new CookieHelper(HttpContext.Response);
        newCookieHelper.SetLoginCookie(userName, password, rememberMe);
        return true;
    } else {
        return false;
    }
}

      
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados