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.