You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法完成授权逻辑。你只需要确保:

  1. 处理程序已注册到DI
  2. 策略中添加了对应的Requirement实例

这样处理程序的依赖注入完全由DI容器管理,不需要手动创建实例。

内容的提问来源于stack exchange,提问作者user14422180

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:15:49