gpt4 book ai didi

c# - 授权策略的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 19:43:36 25 4
gpt4 key购买 nike

我想为我的 ASP.NET Core 应用创建基于声明的授权:

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
}

问题是我有一个非平凡的方法来解决员工编号(1 到 5),我想使用 DI 服务:
public interface IEmployeeProvider {

string[] GetAuthorizedEmployeeIds();
}

我想注入(inject)此服务并在 AddPolicy 中使用它,例如:
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", *employeeProvider.GetAuthorizedEmployeeIds()));
});

备注

我知道我可以编写自己的 AuthorizationHandler 来轻松注入(inject) IEmployeeProvider但我反对这种模式,因为:
  • 已经有一个处理程序可以完全满足我的需要
  • 我需要为每种 claim 类型和每个不同的要求编写一个新的处理程序
  • 这是一种反模式,因为员工 ID 应该是需求的一部分,而处理程序应该是处理需求的通用组件

  • 所以我正在寻找一种在构建策略时注入(inject)服务的方法

    最佳答案

    通过 @MichaelShterenberg 补充提供的答案,配置委托(delegate)可以使用 IServiceProvider允许额外的依赖

    public static IServiceCollection AddAuthorization(this IServiceCollection services,
    Action<AuthorizationOptions, IServiceProvider> configure) {
    services.AddOptions<AuthorizationOptions>().Configure<IServiceProvider>(configure);
    return services.AddAuthorization();
    }

    根据原始示例,可以使用哪个
    public void ConfigureServices(IServiceCollection services) {

    //...

    service.AddScoped<IEmployeeProvider, EmployeeProvider>();

    services.AddAuthorization((options, sp) => {
    IEmployeeProvider employeeProvider = sp.GetRequiredService<IEmployeeProvider>();
    options.AddPolicy("Founders", policy =>
    policy.RequireClaim("EmployeeNumber", employeeProvider.GetAuthorizedEmployeeIds())
    );
    });

    //...
    }

    如果需要其他依赖项,可以从服务提供商处解决。

    关于c# - 授权策略的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59083989/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com