首页 > 解决方案 > 授权策略的依赖注入

问题描述

我想为我的 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();
}

我想注入此服务并在 AddPolicy 中使用它,例如:

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

笔记

我知道我可以编写自己的 AuthorizationHandler 来轻松注入IEmployeeProvider,但我反对这种模式,因为:

  1. 已经有一个处理程序可以完全满足我的需要
  2. 我需要为每种索赔类型和每种不同的要求编写一个新的处理程序
  3. 这是一种反模式,因为员工 ID 应该是需求的一部分,而处理程序应该是处理需求的通用组件

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

标签: c#asp.net-coredependency-injectionauthorization

解决方案


为了补充@MichaelShterenberg提供的答案,配置委托可以使用 aIServiceProvider来允许其他依赖项

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())
        );
    });

    //...
}

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


推荐阅读