Blazor授权场景下动态添加Policy声明的高效实现方案咨询
实现方案
针对你们基于Azure AD + Azure Groups的授权场景,只要调整自定义IAuthorizationPolicyProvider的实现逻辑,就能完全实现免手动逐个添加策略的效果,核心思路是做策略命名和授权规则的约定式映射:
- 先约定策略命名和授权规则的对应关系,最简单的适配你们场景的约定是:直接将Azure Group的Object ID作为策略名,要求用户属于对应组即可通过授权。
- 实现自定义授权策略提供程序,代码如下:
public class AzureGroupAuthorizationPolicyProvider : IAuthorizationPolicyProvider { // 返回默认策略,保持和默认行为一致:要求用户已认证 public Task<AuthorizationPolicy> GetDefaultPolicyAsync() { return Task.FromResult(new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build()); } // 无特殊回退策略要求直接返回null即可 public Task<AuthorizationPolicy?> GetFallbackPolicyAsync() { return Task.FromResult<AuthorizationPolicy?>(null); } // 动态生成策略,不需要预注册任何策略 public Task<AuthorizationPolicy?> GetPolicyAsync(string policyName) { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() // 直接用传入的策略名作为要求的groups声明值 .RequireClaim("groups", policyName) .Build(); return Task.FromResult<AuthorizationPolicy?>(policy); } }
- 在Blazor WASM Client项目的Program类中替换默认的策略提供程序,不需要再调用任何
AddPolicy方法:
builder.Services.AddAuthorizationCore(); // 替换默认授权策略提供程序 builder.Services.AddSingleton<IAuthorizationPolicyProvider, AzureGroupAuthorizationPolicyProvider>();
扩展优化
如果需要支持更复杂的授权规则,可以灵活调整约定逻辑:
- 给策略名增加前缀区分规则类型,比如
Group:xxx代表要求属于指定组、Role:xxx代表要求有指定角色,在GetPolicyAsync方法中解析前缀生成对应策略即可 - 需要支持多组校验的,可以约定用分隔符拼接组ID,比如
Or:GroupA,GroupB代表满足任意一个组即可、And:GroupA,GroupB代表需要同时属于多个组,拆分策略名后按规则生成对应要求 - 为了降低使用成本,可以封装静态常量类存储内部常用组对应的策略值,同事直接引用常量即可,不需要记忆组ID
你之前自定义Provider未达到预期的常见原因是没有做动态生成逻辑,仍然依赖预注册的策略集合,按上述方案调整即可实现零手动策略添加的效果。
内容的提问来源于stack exchange,提问作者Roddik
相关产品推荐
相关产品推荐

