.NET Core如何避免授权策略中的重复条件设置
解决授权策略重复配置的优雅方案
你可以通过两种更优雅的方式避免重复添加AddAuthenticationSchemes和RequireAuthenticatedUser:
方案1:复用基础策略模板
先定义包含通用规则的基础策略构建器,之后每个自定义策略直接基于这个模板扩展,不用重复写通用配置:
// 定义通用基础规则 var basePolicyBuilder = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(Constants.Scheme) .RequireAuthenticatedUser(); // 基于模板创建各业务策略 options.AddPolicy("policy_01", builder => { builder.Combine(basePolicyBuilder.Build()) .RequireClaim("client_claim01", "value01"); }); options.AddPolicy("policy_99", builder => { builder.Combine(basePolicyBuilder.Build()) .RequireClaim("client_claim99", "value99"); });
这种方式直观可控,不需要额外扩展或自定义组件,直接复用已有API就能减少重复代码。
方案2:全局自定义策略提供器
如果希望完全隐式给所有策略自动添加通用要求,不用修改任何策略定义代码,可以自定义IAuthorizationPolicyProvider:
1. 实现自定义策略提供器
public class GlobalPolicyProvider : DefaultAuthorizationPolicyProvider { private readonly AuthorizationOptions _options; public GlobalPolicyProvider(IOptions<AuthorizationOptions> options) : base(options) { _options = options.Value; } public override async Task<AuthorizationPolicy> GetPolicyAsync(string policyName) { // 获取原策略 var originalPolicy = await base.GetPolicyAsync(policyName); if (originalPolicy == null) return null; // 给原策略追加通用要求 var modifiedPolicy = new AuthorizationPolicyBuilder(originalPolicy) .AddAuthenticationSchemes(Constants.Scheme) .RequireAuthenticatedUser() .Build(); return modifiedPolicy; } }
2. 注册自定义提供器
在Program.cs或Startup.cs中替换默认的策略提供器:
services.AddSingleton<IAuthorizationPolicyProvider, GlobalPolicyProvider>();
这样所有已定义的策略(包括你现有的policy_01到policy_99)都会自动带上指定的认证方案和已认证用户要求,完全不用修改原有策略代码。
内容的提问来源于stack exchange,提问作者Konrad Viltersten
相关产品推荐
相关产品推荐

