Mic*_*erg 4 c# authorization dependency-injection asp.net-core
我想为我的 ASP.NET Core 应用程序创建一个基于声明的授权:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
}
Run Code Online (Sandbox Code Playgroud)
问题是我有一个非平凡的方法来解决员工编号(1 到 5),我想使用 DI 服务:
public interface IEmployeeProvider {
string[] GetAuthorizedEmployeeIds();
}
Run Code Online (Sandbox Code Playgroud)
我想注入此服务并在 AddPolicy 中使用它,例如:
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", *employeeProvider.GetAuthorizedEmployeeIds()));
});
Run Code Online (Sandbox Code Playgroud)
笔记
我知道我可以编写自己的 AuthorizationHandler 来轻松注入,IEmployeeProvider但我反对这种模式,因为:
所以我正在寻找一种在构建策略时注入服务的方法
Mic*_*erg 10
感谢恩科西的提示!
由于AddAuthorization基本上是AuthorizationOptions在幕后配置的,因此我遵循相同的模式,只是用于OptionsBuilder配置具有依赖项的选项
我创建了自己的 AddAuthorization 方法来接受依赖项:
public static IServiceCollection AddAuthorization<TDep>(
this IServiceCollection services,
Action<AuthorizationOptions, TDep> configure) where TDep : class
{
services.AddOptions<AuthorizationOptions>().Configure<TDep>(configure);
return services.AddAuthorization();
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用它来正确配置需求:
services.AddAuthorization<IEmployeeProvider>((options, employeeProvider> =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", employeeProvider.GetAuthorizedEmployeeIds())
);
});
Run Code Online (Sandbox Code Playgroud)
如果您需要更多依赖项,您可以遵循相同的技术(OptionsBuilder.Configure最多支持 5 个依赖项)
显然,当升级到较新的 ASP 版本时,此解决方案需要额外验证,因为底层实现AddAuhtorization可能会发生变化
为了补充@MichaelShterenberg提供的答案,配置委托可以使用 aIServiceProvider来允许其他依赖项
public static IServiceCollection AddAuthorization(this IServiceCollection services,
Action<AuthorizationOptions, IServiceProvider> configure) {
services.AddOptions<AuthorizationOptions>().Configure<IServiceProvider>(configure);
return services.AddAuthorization();
}
Run Code Online (Sandbox Code Playgroud)
其中,基于原始示例,可以使用
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())
);
});
//...
}
Run Code Online (Sandbox Code Playgroud)
如果需要其他依赖项,可以从服务提供商处解决。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |