« Voltar
em .net .net core c# asp.net core session cookies

Session vazia no ASP.NET Core e o CheckConsentNeeded.

Estava esses dias dando uma aula aqui na Caelum e estávamos fazendo uma tela de login em uma aplicação.

A action que fazia a autenticação no controller era bem simples:

[HttpPost]
public IActionResult Autentica(LoginViewModel model)  
{
    if (ModelState.IsValid)
    {
        var usuario = _dao.Busca(model.Login, model.Senha);

        if (usuario != null)
        {
            HttpContext.Session.SetString("usuario", JsonConvert.SerializeObject(usuario));
            return RedirectToAction("Index", "Post", new { area = "Admin" });
        }
        else
        {
            ModelState.AddModelError("login.Invalido", "Login ou senha incorretos");
        }
    }

    return View("Login", model);
}

Se o usuário existor no banco, jogamos na Session. Tranquilo, certo?

Fizemos então um simples filtro de autorização: ele verificava se o usuário tinha feito login e se tivesse feito, beleza.
Se não, redirecionaria para a tela de login.

Assim:

public class AutorizacaoFilterAttribute : ActionFilterAttribute  
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var usuario = filterContext.HttpContext.Session.GetString("usuario");

        if (string.IsNullOrWhiteSpace(usuario))
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        area = "",
                        controller = "Usuario",
                        action = "Login"
                    }));
        }
    }
}

O problema é que na primeira linha do método OnActionExecuting a Session estava chegando vazia, mesmo depois de preenchermos ela na autenticação.

Depois de um tempo pesquisando, descobrimos a solução.

A propriedade CheckConsentNeeded

Lá na classe Startup da aplição, temos o método ConfigureServices e dentro dele o código necessário para configurar os serviços da aplicação.

Quando criamos um projeto do tipo ASP.NET Core MVC, ele gera essa classe já com esse trecho de código dentro desse método:

services.Configure<CookiePolicyOptions>(options =>  
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

E é aí que entra essa propriedade chamada CheckConsentNeeded. Se olharmos a documentação da Microsoft, ela diz que ela serve para "Verificar se as políticas de consentimento devem ser avaliadas nessa request".

Isso significa que o usuário tem que aceitar o uso de cookies pelo seu site. Sabe quando você entra em sites hoje em dia e eles falam "esse site usa cookies, você precisa aceitar e consentir para continuar" ou algo do tipo?
Então, essa propriedade serve pra isso. Como essa verificação está ligada mas eu não chequei se o usuário consentiu, a Session vem vazia porque é como se ela não estivesse habilitada.

Isso tudo é por causa da GDPR, uma série de regras que a União Européia fez para garantir a privacidade dos usuários na internet.

No fim das contas, pra resolver esse problema apenas setamos essa propriedade pra false e boa :)

services.Configure<CookiePolicyOptions>(options =>  
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

Quer ficar em dia com os meus posts e novidades?

Me segue no Twitter e participe do grupo no Telegram!

Aproveite e também e inscreva na minha newsletter, e na minha página :)

comments powered by Disqus