.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
相关产品推荐
相关产品推荐

