c# - 授权策略的依赖注入
问题描述
我想为我的 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
,但我反对这种模式,因为:
- 已经有一个处理程序可以完全满足我的需要
- 我需要为每种索赔类型和每种不同的要求编写一个新的处理程序
- 这是一种反模式,因为员工 ID 应该是需求的一部分,而处理程序应该是处理需求的通用组件
所以我正在寻找一种在构建策略时注入服务的方法
解决方案
为了补充@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())
);
});
//...
}
如果需要其他依赖项,可以从服务提供商处解决。
推荐阅读
- regex - Windows Batch 中的正则表达式以自动化 Docker 运行
- python - Python:在 Pandas 中,根据条件从数据框中的几列中提取数据,并添加到列上匹配的不同数据框中
- angular - 带有 Jest 的 Angular 8 - 'jasmine' 没有导出的成员 'SpyObj'
- ios - 如何使用 SwiftUI 在 NavigationView 中正确包含“添加项目”按钮?
- python - 为什么使用 `open(False)` 阅读有效?
- amazon-web-services - AWS Transcribe 无法正确识别我的文件的媒体格式
- sharepoint - 来自 Angular 的 JSOM/SP.js?
- javascript - 将 Promise 中的 resolve 函数分配给变量
- java - 为什么我会收到此 JsonObjectRequest 错误?我究竟做错了什么?
- javascript - 向服务器提交 HTML 表单(POST req)应返回动态 HTML