.NET

5 jun, 2018

Obtendo o Usuário Logado em APIs ASP.Net Core

Publicidade

No artigo anterior eu mostrei como criar uma API de autenticação em ASP.Net Core com JWT. Hoje veremos como obter o usuário autenticado, extraindo os dados do token de uma forma muito simples.

Para isso, o ASP.Net Core oferece uma biblioteca de abstrações HTTP (pacote nuget Microsoft.AspNetCore.Http.Abstractions) que contém a interface IHttpContextAccessor.

A classe HttpContextAccessor implementa tal interface e possui uma propriedade onde podemos obter o HttpContext da requisição, e com ele a identidade do usuário logado. Ela deve ser registrada no contêiner de DI como Singleton.

Para simplificar as coisas, podemos criar uma classe que representa nosso usuário logado na aplicação. No meu caso, ela se chama AuthenticatedUser, e recebe em seu construtor uma instância de IHttpContextAccessor.

public class AuthenticatedUser
{
	private readonly IHttpContextAccessor _accessor;

	public AuthenticatedUser(IHttpContextAccessor accessor)
	{
		_accessor = accessor;
	}

	public string Email => _accessor.HttpContext.User.Identity.Name;
	public string Name => GetClaimsIdentity().FirstOrDefault(a => a.Type == ClaimTypes.NameIdentifier)?.Value;

	public IEnumerable<Claim> GetClaimsIdentity()
	{
		return _accessor.HttpContext.User.Claims;
	}
}

Também devemos fazer o registro dessa classe no contêiner de DI, e ela deve ser utilizada onde for necessário obter o usuário logado.

public void ConfigureServices(IServiceCollection services)
{
	// ... restante do método ocultado

	services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
	services.AddScoped<AuthenticatedUser>();
}

O HttpContext será recriado à cada nova requisição HTTP na aplicação.

Com isso, podemos injetar um AuthenticatedUser em qualquer classe que precisarmos dele.

Conclusão

Fazendo uso do HttpContextAccessor em conjunto com a injeção de dependências, temos um jeito fácil de obter o usuário autenticado e utilizá-lo em qualquer camada de nossa aplicação conforme a necessidade. Em versões anteriores do ASP.Net isso também era possível, porém, um pouco mais trabalhoso. Com isso, temos à nossa disposição um recurso muito poderoso que nos dá muita flexibilidade ao trabalharmos com o contexto da requisição HTTP em nossas aplicações.

Espero que tenham gostado, e se ficou alguma dúvida ou caso tenham críticas e sugestões, entrem em contato.

Abraços!