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

.NET 9 Blazor如何自动收集应用内所有授权策略?

可行的自动收集策略方案

针对你在.NET 9 Blazor中收集所有权限策略(包括AuthorizeView内定义的)的需求,以下是几个实际可落地的方案:

1. 自定义AuthorizeView组件+静态策略注册表

你之前尝试封装自定义组件的思路是对的,大概率是实现细节没到位。具体步骤如下:

  • 创建自定义组件AuthorizePolicy,内部封装原生AuthorizeView,同时在组件初始化时将Policy值注册到静态集合:
    @inherits ComponentBase
    @using Microsoft.AspNetCore.Components.Authorization
    
    [Parameter] public string Policy { get; set; } = string.Empty;
    [Parameter] public RenderFragment? ChildContent { get; set; }
    
    protected override void OnInitialized()
    {
        // 避免重复添加策略
        if (!string.IsNullOrEmpty(Policy) && !PolicyRegistry.Policies.Contains(Policy))
        {
            PolicyRegistry.Policies.Add(Policy);
        }
        base.OnInitialized();
    }
    
    <AuthorizeView Policy="@Policy">
        @ChildContent
    </AuthorizeView>
    
  • 新建静态类PolicyRegistry存储所有策略:
    public static class PolicyRegistry
    {
        public static HashSet<string> Policies { get; } = new HashSet<string>();
    }
    
  • 项目中所有权限控制场景都用这个自定义组件替代原生AuthorizeView。启动时,PolicyRegistry.Policies会包含所有通过自定义组件使用的策略,再结合你通过反射收集的类级别[Authorize]属性中的策略,就能得到完整的策略列表。

2. 编译时用Roslyn分析器扫描Razor文件

这个方案无需修改业务代码,直接在编译阶段完成策略收集:

  • 编写Roslyn分析器,扫描所有.razor文件的语法树,识别AuthorizeView标签的Policy属性值,同时扫描类级别[Authorize(Policy="xxx")]的属性值。
  • 分析器收集到所有策略后,自动生成包含所有策略常量的静态类(比如AllPolicies.cs),启动时直接读取该类内容即可。
  • 注意:需要掌握Roslyn语法分析API,适合有一定编译原理基础的场景,优势是完全不侵入业务代码,编译阶段就能完成收集。

3. 集中管理策略清单(妥协但高效的方案)

如果上述方案觉得复杂,可直接维护全局策略清单:

  • 新建静态类定义所有策略常量:
    public static class AppPolicies
    {
        public const string CounterPage = "Counter.Page";
        public const string CounterIncrement = "Counter.IncrementCount";
        public const string CounterDecrement = "Counter.DecrementCount";
        // 其他策略...
    
        public static IEnumerable<string> AllPolicies => typeof(AppPolicies)
            .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
            .Where(f => f.FieldType == typeof(string))
            .Select(f => f.GetValue(null) as string)
            .Where(s => !string.IsNullOrEmpty(s));
    }
    
  • 业务代码中统一使用这些常量:
    @attribute [Authorize(Policy = AppPolicies.CounterPage)] 
    
    <AuthorizeView Policy = "@AppPolicies.CounterIncrement">
        <Button> Increment </button>
    </AuthorizeView>
    
  • 启动时直接调用AppPolicies.AllPolicies即可获取所有策略,无需反射或扫描,简单直接且便于后期维护。

内容的提问来源于stack exchange,提问作者kocapb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:37:07