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

Blazor WebAssembly 如何实现基于策略的授权?

Blazor WebAssembly 基于策略的授权实现(利用现有ASP.NET Identity表)

可以直接基于现有的AspNetRoleClaims、AspNetUserClaims表实现策略授权,不需要额外创建表或复杂逻辑,核心是将权限声明存储到这两张表中,再通过授权策略关联声明即可。具体步骤如下:

1. 服务端配置授权策略

在Blazor WASM的Server项目(或身份认证服务端)的Program.cs中,添加策略定义,将策略与指定的声明绑定:

builder.Services.AddAuthorization(options =>
{
    // 定义"CanBuy"策略,要求用户拥有"Permission"类型、值为"CanBuy"的声明
    options.AddPolicy("CanBuy", policy =>
        policy.RequireClaim("Permission", "CanBuy"));
});

2. 给用户/角色添加权限声明

利用现有表存储权限声明,有两种方式:

方式1:直接操作数据库表

  • 给角色批量授权:在AspNetRoleClaims表中插入记录,RoleId关联目标角色ID,ClaimType设为"Permission",ClaimValue设为"CanBuy",该角色下的所有用户都会继承这个权限。
  • 给单个用户授权:在AspNetUserClaims表中插入记录,UserId关联目标用户ID,ClaimType和ClaimValue同上,仅该用户拥有此权限。

方式2:通过代码添加声明

在服务端的初始化逻辑或后台管理功能中,使用RoleManager/UserManager添加声明:

// 给Admin角色添加CanBuy权限声明
var roleManager = app.Services.GetRequiredService<RoleManager<IdentityRole>>();
var adminRole = await roleManager.FindByNameAsync("Admin");
if (adminRole != null)
{
    await roleManager.AddClaimAsync(adminRole, new Claim("Permission", "CanBuy"));
}

// 给单个用户添加CanBuy权限声明
var userManager = app.Services.GetRequiredService<UserManager<IdentityUser>>();
var targetUser = await userManager.FindByNameAsync("test_user");
if (targetUser != null)
{
    await userManager.AddClaimAsync(targetUser, new Claim("Permission", "CanBuy"));
}

3. Blazor客户端使用策略授权

在组件中直接使用<AuthorizeView Policy="CanBuy">即可:

<AuthorizeView Policy="CanBuy">
    <Authorized>
        <button class="btn btn-primary">购买商品</button>
    </Authorized>
    <NotAuthorized>
        <p class="text-danger">您没有购买权限,请联系管理员</p>
    </NotAuthorized>
</AuthorizeView>

关键注意事项

  • 确保登录时自定义声明被正确传递到客户端:如果使用JWT认证,需在服务端配置JWT生成逻辑,将Permission类型的声明包含到令牌中;如果使用Identity Server,需在ProfileService中添加该声明,或在ApiResource配置中包含对应的Claim范围。
  • 策略名称需与配置和组件中的名称完全一致,大小写敏感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:03:57