如何在Blazor中从appsettings动态设置Authorize标签与属性的允许角色
Blazor服务端动态从appsettings填充授权配置的实现方案
前提准备
首先你可以将菜单和页面的权限配置统一放在appsettings.json中,参考结构如下:
{ "MenuItems": [ { "MenuItemName":"受保护的菜单项", "AllowedGroups": ["Administrator", "SpecialGroup", "SpecialGroup2"] } ], "PagePermissions": { "Home": { "AllowedGroups": ["Administrator", "SpecialGroup"] } } }
1. 为<AuthorizeView>组件动态填充Roles属性
直接在组件中注入IConfiguration,将读取到的角色数组拼接为逗号分隔的字符串传入Roles属性即可,示例代码如下:
@inject IConfiguration Configuration @{ // 读取对应菜单项的允许角色组 var protectedMenuGroups = Configuration.GetSection("MenuItems") .GetChildren() .First(item => item.GetValue<string>("MenuItemName") == "受保护的菜单项") .GetValue<string[]>("AllowedGroups"); var allowedRoles = string.Join(',', protectedMenuGroups); } <AuthorizeView Roles="@allowedRoles"> <p>只有管理员或特殊组成员可以看到该菜单项</p> </AuthorizeView>
如果是通用布局,你可以将菜单配置提前封装为强类型服务注入,直接遍历生成所有菜单项即可,无需单独读取每个节点。
2. 为页面级[Authorize]属性动态填充Roles值
因为C#特性的参数必须是编译时常量,无法直接传入运行时读取的配置值,推荐使用自定义授权政策的方案实现:
第一步:在Program.cs中注册授权政策
启动时从配置读取对应页面的允许角色,注册为命名授权政策:
var builder = WebApplication.CreateBuilder(args); // 注册授权政策 builder.Services.AddAuthorization(options => { // 读取首页允许的角色组,注册为HomeAccess政策 var homeAllowedGroups = builder.Configuration .GetSection("PagePermissions:Home:AllowedGroups") .Get<string[]>(); options.AddPolicy("HomeAccess", policy => policy.RequireRole(homeAllowedGroups)); // 其他页面的政策可以按同样规则批量注册 }); // 其余服务注册逻辑... var app = builder.Build(); // 中间件配置... app.Run();
第二步:页面中直接使用对应政策
@page "/" @attribute [Authorize(Policy = "HomeAccess")] <p>只有政策允许的角色可以访问当前页面</p>
如果需要批量处理多个页面的权限配置,也可以写扩展方法自动遍历PagePermissions节点批量注册所有页面的授权政策,无需手动逐个添加。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

