ASP.NET Core基于策略授权如何复用Authorization Handler及实现超级用户权限
授权Handler复用方案
有两种比直接复制代码更优雅的实现方式,优先推荐第一种:
- 泛型基类封装通用逻辑
先把BadgeId校验的公共逻辑抽成抽象泛型基类:
public abstract class BaseEntryHandler<TRequirement> : AuthorizationHandler<TRequirement> where TRequirement : IAuthorizationRequirement { protected bool CheckValidBadge(AuthorizationHandlerContext context) { return context.User.HasClaim(c => c.Type == "BadgeId" && c.Issuer == "http://microsoftsecurity"); } }
原有BadgeEntryHandler可以直接继承基类简化实现:
public class BadgeEntryHandler : BaseEntryHandler<BuildingEntryRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BuildingEntryRequirement requirement) { if (CheckValidBadge(context)) { context.Succeed(requirement); } return Task.CompletedTask; } }
新增的WarehouseEntryRequirement对应Handler可以直接复用逻辑,再补充CEO身份校验即可:
public class WarehouseEntryHandler : BaseEntryHandler<WarehouseEntryRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, WarehouseEntryRequirement requirement) { if (CheckValidBadge(context) || context.User.HasClaim(c => c.Type == "IsCEO" && c.Value == "true")) { context.Succeed(requirement); } return Task.CompletedTask; } }
- 公共校验服务注入
如果通用逻辑需要依赖其他注入服务,可以把公共校验逻辑封装成独立的授权校验服务,注入到各个Handler中调用,耦合度更低。
全局超级用户免校验实现方案
最优方案是实现全局无绑定的授权Handler,不需要修改任何现有策略和接口配置,逻辑全局生效:
- 实现超级用户全局Handler:
public class SuperUserHandler : IAuthorizationHandler { public Task HandleAsync(AuthorizationHandlerContext context) { // 校验是否为超级用户,可根据实际业务调整判断规则 if (context.User.HasClaim(c => c.Type == "IsSuperAdmin" && c.Value == "true")) { // 直接标记所有待校验的授权需求全部通过 foreach (var requirement in context.PendingRequirements) { context.Succeed(requirement); } } // 非超级用户不做任何处理,交给后续正常授权流程执行 return Task.CompletedTask; } }
- 注册Handler到DI容器:
services.AddSingleton<IAuthorizationHandler, SuperUserHandler>();
该方案完全不侵入现有授权逻辑,超级用户判断规则全局统一维护,后续新增任何授权策略都不需要额外适配超级用户规则。
内容的提问来源于stack exchange,提问作者Lukasz Pomianowski
相关产品推荐
相关产品推荐

