如何优化C#授权策略注册中的重复匿名委托代码?
优化授权策略重复代码方案
问题分析
你的代码存在大量重复逻辑:每个策略都重复执行Claims查找、JSON反序列化、权限判断的步骤,且原代码中WtmPolicy被错误嵌套在CmPolicy的配置委托内,会导致策略注册异常。
优化方案
通过提取通用验证逻辑+批量注册策略的方式消除重复:
- 提取通用权限检查方法
把重复的Claims解析、权限验证逻辑封装成单独方法,复用逻辑:
private static bool HasRequiredOption(ClaimsPrincipal user, string requiredOption) { var optionsSerialized = user.FindFirstValue(ClaimType.Options); if (string.IsNullOrEmpty(optionsSerialized)) return false; var userOptions = JsonSerializer.Deserialize<string[]>(optionsSerialized); return userOptions?.Contains(requiredOption) == true; }
- 批量注册策略
遍历所有权限值,批量生成并注册对应的授权策略,避免重复的AddPolicy调用:
// 定义所有权限与对应策略名的映射 var permissionPolicies = new Dictionary<string, string> { { "um", "UmPolicy" }, { "cm", "CmPolicy" }, { "wtm", "WtmPolicy" } }; foreach (var (permission, policyName) in permissionPolicies) { policyBuilder.AddPolicy(policyName, policy => { policy.RequireAssertion(context => HasRequiredOption(context.User, permission)); }); }
优化说明
- 消除重复代码:通用方法集中处理Claims解析、反序列化和权限判断逻辑,后续新增权限只需在映射字典中添加条目即可。
- 修复原代码错误:解决了
WtmPolicy嵌套注册的问题,确保所有策略都能正确注册。 - 提升可维护性:权限与策略名的映射清晰,后续修改权限或策略名只需调整字典,无需修改大量重复代码。
内容的提问来源于stack exchange,提问作者Kyselevych
相关产品推荐
相关产品推荐

