Getting the ClaimsPrincipal in a logic layer in an

2020-08-09 10:19发布

问题:

I'm writing an aspnet core 1 application. Using a bearer token authentication I have the User property inside the controller with the correct identity. However I cant seem to find a way to grab with identity as I did before using the ClaimPrincipal.Current static. What is the current best practice to get this data inside the BL layers with out passing the ClaimPrincipal object around?

回答1:

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.



回答2:

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.



标签: asp.net .net