You can access the currently authenticated user from a controller action method in the following way:
[Route("[controller]")]
public class InternalController : ControllerBase
{
[HttpGet]
[Authorize]
public string GetCurrentUser()
{
return base.User.Identity.Name;
}
}
To access it outside the controller, for example in a MediatR handler, you need to inject and use the IHttpContextAccessor
service, which is already provided by ASP.NET:
[Route("[controller]")]
public class InternalController : ControllerBase
{
private readonly IMediator _mediator;
public InternalController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
[Authorize]
public async Task<string> GetCurrentUser()
{
var response = await _mediator.Send(new GetCurrentUser.Request());
return response.CurrentUserName;
}
}
public class GetCurrentUser
{
public class Request : IRequest<Response> { }
public class Response
{
public string CurrentUserName { get; set; }
}
public class Handler : IRequestHandler<Request, Response>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public Handler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public Task<Response> Handle(Request request, CancellationToken cancellationToken)
{
return Task.FromResult(new Response
{
CurrentUserName = _httpContextAccessor.HttpContext.User.Name
});
}
}
}
Finally, to make this work, you need to register the IHttpContextAccessor
dependency in your Startup
class:
// ConfigureServices
services.AddHttpContextAccessor();
Top comments (1)
In this example just we get the current user email or name, but how we can get the full user details,