使用Entra的Blazor WASM应用如何限制仅俱乐部成员访问?
基于Entra的Blazor WASM应用授权方案优化
针对你不想手动维护邮箱列表、无需邀请用户进目录的需求,以下几个方案可以实现快速授权:
方案一:Entra自定义属性 + 条件访问 + 自动化审批流
这个方案不需要将用户加入你的Entra目录,仅通过用户的身份标识结合自定义属性做授权校验:
- 步骤1:添加自定义用户属性:在Entra ID中创建一个扩展属性(比如
extension_<你的应用ClientId>_IsAuthorized),用于标记用户是否已授权 - 步骤2:配置条件访问策略:创建策略,针对你的Blazor应用和WebApi,当用户的
IsAuthorized属性不为true时,阻止访问或重定向到你的自定义申请页面 - 步骤3:搭建申请与审批自动化:在Blazor中添加申请页面,用户提交申请后触发Power Automate流程,你收到审批通知(邮件/Teams消息),审批通过后自动调用Graph API将该用户的
IsAuthorized属性设为true - 代码层面校验:在Blazor和WebApi中配置授权策略,检查用户Claims中是否存在
IsAuthorized=true的声明,示例如下:
// Blazor Program.cs 配置授权策略 builder.Services.AddAuthorization(options => { options.AddPolicy("Authorized", policy => policy.RequireClaim("IsAuthorized", "true")); }); // 自定义Claims转换,从Graph API获取用户属性 public class ClaimsTransformer : IClaimsTransformation { private readonly GraphServiceClient _graphClient; public ClaimsTransformer(GraphServiceClient graphClient) { _graphClient = graphClient; } public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { var userId = principal.FindFirstValue(ClaimTypes.NameIdentifier); var user = await _graphClient.Users[userId].Request() .Select(u => new { u.Id, u.Extensions }) .GetAsync(); var isAuthorized = user.Extensions.TryGetValue("extension_xxx_IsAuthorized", out var value) && value.ToString() == "true"; if (isAuthorized) { ((ClaimsIdentity)principal.Identity).AddClaim(new Claim("IsAuthorized", "true")); } return principal; } }
方案二:Entra B2B自助注册 + 审批
如果需要统一管理用户角色,可利用Entra B2B的自助注册功能:
- 开启自助注册:在Entra ID的外部协作设置中,开启"自助注册B2B用户",配置注册页面的字段(比如申请理由)
- 设置审批规则:配置审批流程,指定你作为审批人,用户提交注册申请后,你在Entra后台或邮件中审批,通过后用户自动加入你的目录,并可自动分配预设角色
- 授权校验:直接使用Entra的角色声明做授权,比如在WebApi中用
[Authorize(Roles = "User")],无需额外维护邮箱列表
方案三:自定义授权数据库 + 轻量审批后台
如果不想依赖Entra的高级功能,可自己实现轻量授权系统:
- 存储授权状态:在数据库中创建
UserAuthorization表,记录用户的Entra ObjectID、邮箱、授权状态 - 申请与审批:Blazor应用中添加申请页面,用户提交后你收到通知,在自己开发的后台管理页面中一键标记用户为已授权
- API校验中间件:WebApi中添加中间件,每次请求验证用户的Entra身份后,查询数据库确认是否已授权,未授权则返回403
各方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 自定义属性+审批流 | 无需维护目录用户,自动化程度高 | 需要调用Graph API,配置稍复杂 |
| B2B自助注册 | Entra原生支持,角色管理方便 | 用户会加入你的目录,需要管理目录用户 |
| 自定义数据库 | 完全自主控制,灵活度高 | 需要开发维护申请和管理页面 |
内容的提问来源于stack exchange,提问作者Mog0
相关产品推荐
相关产品推荐

