ASP.NET中依赖注入实现自定义授权需求处理程序的问题
解决方案
你混淆了**授权需求(Requirement)和授权处理程序(Handler)**的职责:Requirement是定义规则的标记/配置类,Handler是执行规则逻辑并依赖注入服务的类,两者不需要在策略配置中绑定,ASP.NET Core授权系统会自动关联。
步骤1:补全授权需求类
首先定义你的MyRequirement(它不需要依赖注入,仅作为规则标识,如需配置参数可在类中添加):
public class MyRequirement : IAuthorizationRequirement { // 可选:添加需求的配置参数,比如阈值、名称等 }
步骤2:修正处理程序的构造函数
你的处理程序类名是MyHandler,但构造函数写了UserExistsHandler,属于笔误,修正后:
class MyHandler : AuthorizationHandler<MyRequirement> { readonly IDependent _dependency; public MyHandler(IDependent dependency) { _dependency = dependency; } protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement) { // 这里可以使用_dependency执行授权逻辑 context.Succeed(requirement); return Task.CompletedTask; } }
步骤3:正确注册并配置授权
- 先注册
IDependent的实现到DI容器 - 注册处理程序到DI容器
- 在策略中仅添加Requirement实例,无需传入Handler
// 注册IDependent的具体实现 builder.Services.AddSingleton<IDependent, DependentImplementation>(); // 注册授权处理程序到DI builder.Services.AddSingleton<IAuthorizationHandler, MyHandler>(); builder.Services.AddAuthorization(config => { config.AddPolicy("MyPolicy", policy => { // 仅添加需求实例,处理程序由DI自动匹配 policy.AddRequirements(new MyRequirement()); }); });
原理说明
ASP.NET Core授权系统会自动根据Requirement的类型,从DI容器中查找对应的AuthorizationHandler<TRequirement>实例,调用其HandleRequirementAsync方法完成授权逻辑。你只需要确保:
- 处理程序已注册到DI
- 策略中添加了对应的Requirement实例
这样处理程序的依赖注入完全由DI容器管理,不需要手动创建实例。
内容的提问来源于stack exchange,提问作者user14422180
相关产品推荐
相关产品推荐

