You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor授权场景下动态添加Policy声明的高效实现方案咨询

实现方案

针对你们基于Azure AD + Azure Groups的授权场景,只要调整自定义IAuthorizationPolicyProvider的实现逻辑,就能完全实现免手动逐个添加策略的效果,核心思路是做策略命名和授权规则的约定式映射:

  1. 先约定策略命名和授权规则的对应关系,最简单的适配你们场景的约定是:直接将Azure Group的Object ID作为策略名,要求用户属于对应组即可通过授权。
  2. 实现自定义授权策略提供程序,代码如下:
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:05