Getting the ClaimsPrincipal in a logic layer in an aspnet core 1 application
Here is better answer for dotnet core 2.0 and newer: https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly
Basically add IHttpContextAccessor to services as Singleton:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddHttpContextAccessor();
}
To consume inject IHttpContextAccessor into your class:
public class YourService : IYourService {
private readonly IHttpContextAccessor _httpContextAccessor;
public YourService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
}
and access _httpContextAccessor.HttpContext in your methods.
Further investigating this issue I've found that it is possible to use the native DI container to inject the ClaimsPrincipal
where needed like that:
services.AddTransient<ClaimsPrincipal>(s =>
s.GetService<IHttpContextAccessor>().HttpContext.User);
This feels kind of weird injecting it, however it is better than storing it in the CallContext
.