在Claimsnet core 1应用程序的逻辑层中获取ClaimsPrincipal

Eug*_*vin 8 .net asp.net

我正在编写一个aspnet核心1应用程序.使用承载令牌认证我在控制器内具有正确标识的User属性.但是我似乎找不到像使用ClaimPrincipal.Current静态之前那样抓住身份的方法.目前最好的做法是将这些数据放在BL层中而不传递ClaimPrincipal对象?

Eug*_*vin 25

进一步研究这个问题我发现有可能使用本机DI容器注入ClaimsPrincipal所需的地方:

services.AddTransient<ClaimsPrincipal>(s =>
    s.GetService<IHttpContextAccessor>().HttpContext.User);
Run Code Online (Sandbox Code Playgroud)

这种感觉有点奇怪,但它比将它存放在它中更好CallContext.

  • 那么在启动时注册此内容后,如何阅读声明? (3认同)

小智 8

对于dotnet core 2.0和更高版本,这里是更好的答案:https : //adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-正确地

基本上将IHttpContextAccessor作为Singleton添加到服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddHttpContextAccessor();
}
Run Code Online (Sandbox Code Playgroud)

要将IHttpContextAccessor注入到您的类中:

public class YourService : IYourService {
        private readonly IHttpContextAccessor _httpContextAccessor;

        public YourService(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
}
Run Code Online (Sandbox Code Playgroud)

并在您的方法中访问_httpContextAccessor.HttpContext。

  • @Jess这取决于“YourService”是什么。如果它只是像“ClaimContainer”一样访问声明的抽象,那么它实际上并没有泄漏。如果您的实际服务需要声明并且它依赖于“IHttpContextAccessor”,那么这就存在泄漏。 (3认同)
  • 这是“泄漏抽象”的确切示例。任何需要`ClaimsPrincipal`的东西都不应该知道`IHttpContextAccessor`。 (2认同)