【问题标题】:Getting the ClaimsPrincipal in a logic layer in an aspnet core 1 application在 aspnet core 1 应用程序的逻辑层中获取 ClaimsPrincipal
【发布时间】:2020-04-15 20:51:13
【问题描述】:

我正在编写一个 aspnet core 1 应用程序。 使用不记名令牌身份验证,我在控制器内拥有具有正确身份的 User 属性。但是,我似乎无法像使用 ClaimPrincipal.Current 静态之前那样找到一种获取身份的方法。 在不传递 ClaimPrincipal 对象的情况下,在 BL 层中获取这些数据的当前最佳做法是什么?

【问题讨论】:

    标签: asp.net .net


    【解决方案1】:

    进一步调查这个问题,我发现可以使用本机 DI 容器在需要的地方注入 ClaimsPrincipal

    services.AddTransient<ClaimsPrincipal>(s =>
        s.GetService<IHttpContextAccessor>().HttpContext.User);
    

    注入它感觉有点奇怪,但是它比将它存储在CallContext 中要好。

    【讨论】:

    • @MagendranV 这完全是另一个问题 :) ClaimsPrincipal.Claims 是你想要的
    • 我认为你应该使用services.AddScoped,尽管它在功能上没有任何改变,但它强调,ClaimsPrincial 无论如何都是范围的。
    【解决方案2】:

    以下是 dotnet core 2.0 及更高版本的更好答案:https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly

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

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddHttpContextAccessor();
    }
    

    将 IHttpContextAccessor 注入到你的类中:

    public class YourService : IYourService {
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public YourService(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor;
            }
    }
    

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

    【讨论】:

    • 这是 Leaky Abstraction 的一个精确示例。任何需要ClaimsPrincipal 的东西都不应该知道IHttpContextAccessor
    • 埃里克是正确的。您不应该绕过 IHttpContextAccessor,因为您会为运行测试创建问题。
    • @ErikPhilips 如果您注入 IHttpContextAccessor 的唯一位置是 YourService。然后YourService 返回ClaimsPrincipal。你会认为这是泄漏吗?也许drakkar 没有完全充实这段代码。我想我们可能需要services.AddTransient&lt;IYourService, YourService&gt;();,这样我们就可以将 YourService 用作其他服务的依赖项?
    • @Jess 这取决于YourService 是什么。如果它只是像ClaimContainer 这样的声明的抽象,它实际上并没有泄漏。如果您的实际服务需要声明并且它依赖于IHttpContextAccessor,那么这就是泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多