.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
相关产品推荐
相关产品推荐

