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

.NET 5中如何关联自定义授权特性与对应的授权处理器?

解决方案步骤

1. 注册授权处理器到依赖注入容器

在Startup.cs的ConfigureServices方法中,先把自定义授权处理器注册到DI容器,确保框架能找到并调用它:

public void ConfigureServices(IServiceCollection services)
{
    // ... 其他已有服务注册代码

    // 注册自定义授权处理器
    services.AddScoped<IAuthorizationHandler, WorkItemAuthorizationHandler>();

    // ... 后续配置代码
}

2. 创建关联需求的授权策略

在AddAuthorization配置块里,新增一个专属策略,将WorkItemRequirement与该策略绑定,同时保留你已有的全局授权规则:

services.AddAuthorization(options =>
{
    // 保留原有的全局授权策略(要求用户已认证)
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();

    // 新增WorkItem授权策略,关联自定义需求
    options.AddPolicy("WorkItemAccess", policy =>
    {
        policy.Requirements.Add(new WorkItemRequirement());
        // 如果需要叠加角色校验,可追加.RequireRole("Editor")这类规则
    });
});

3. 让自定义特性关联授权策略

修改你的WorkItemAuthorizeAttribute,让它继承AuthorizeAttribute并指定策略名称,这样标记该特性的控制器/Action会自动触发对应的授权逻辑:

public class WorkItemAuthorizeAttribute : AuthorizeAttribute
{
    public WorkItemAuthorizeAttribute()
    {
        // 关联到上面定义的策略
        Policy = "WorkItemAccess";
    }

    // 如果需要传递自定义参数(比如待校验的工作项ID),可添加对应属性
    // public int TargetWorkItemId { get; set; }
}

4. (可选)在处理器中读取特性参数

如果你的WorkItemAuthorizeAttribute需要传递参数(比如指定要校验的工作项ID),可以在WorkItemAuthorizationHandler中从上下文获取该特性并读取参数,再结合数据库做权限校验:

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, WorkItemRequirement requirement)
{
    // 从上下文获取授权过滤器上下文,进而拿到标记的自定义特性
    var filterContext = context.Resource as AuthorizationFilterContext;
    if (filterContext == null)
    {
        return Task.CompletedTask;
    }

    var workItemAttr = filterContext.ActionDescriptor.EndpointMetadata
        .OfType<WorkItemAuthorizeAttribute>()
        .FirstOrDefault();

    if (workItemAttr != null)
    {
        // 读取特性参数(比如workItemAttr.TargetWorkItemId)
        // 结合数据库查询用户权限,校验通过则调用context.Succeed(requirement)
        var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        // 示例:假设你有一个校验方法CheckUserWorkItemAccess(userId, targetId)
        // if (CheckUserWorkItemAccess(userId, workItemAttr.TargetWorkItemId))
        // {
        //     context.Succeed(requirement);
        // }
    }

    return Task.CompletedTask;
}

完成以上配置后,在控制器Action上标记[WorkItemAuthorize](或带参数的[WorkItemAuthorize(TargetWorkItemId = 123)]),框架就会自动触发WorkItemAuthorizationHandler的逻辑,结合数据库数据完成额外授权校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:10:35