如何在Entra ID中配置ASP.NET Core的权限基访问控制(PBAC)
在Entra ID中实现基于权限的访问控制(PBAC)方案
核心可行方案:用Entra ID应用角色模拟细粒度权限
Entra ID本身没有原生的独立权限实体,但可以通过将细粒度权限定义为应用角色的方式,实现PBAC的效果,具体操作如下:
- 在Entra ID的目标应用注册中,添加新的应用角色:名称设为
trade.execute,显示名称可设为“执行交易权限”,并将“允许分配到”设置为“用户/组” - 将
trade.execute应用角色分配给已有的trader.senior和trader.junior对应的测试用户,也可直接分配给包含这些用户的组(如果已有分组) - 实现
[MyCustomAuthorization(permission = "trade.execute")]属性:在授权逻辑中解析JWT令牌的roles声明(Entra ID会把所有分配的应用角色注入该声明),检查声明中是否包含指定的权限值trade.execute
以.NET为例,自定义授权属性的核心逻辑可参考:
public class MyCustomAuthorizationAttribute : AuthorizeAttribute { public string Permission { get; set; } protected override bool AuthorizeCore(HttpContextBase httpContext) { var userRoles = httpContext.User.Claims .Where(c => c.Type.Equals("roles", StringComparison.OrdinalIgnoreCase)) .Select(c => c.Value); return userRoles.Contains(Permission); } }
备选方案评估
方案1:用Entra Groups管理权限
该方案可行,本质是通过组批量关联权限角色,流程为:
- 创建
Senior Trader、Junior Trader组,将对应用户加入组 - 创建
trade.execute应用角色,分配给这两个组 - 用户登录后,令牌中会包含
trade.execute角色声明,自定义授权属性可基于该声明完成校验
优势:批量管理用户权限更高效,适合用户规模较大的场景;劣势:多了一层组的维护成本,需确保组与权限角色的映射关系准确。
方案2:自定义角色-权限映射层
该方案灵活性最高,但需额外的开发与维护成本:
- 需搭建独立数据存储(如数据库)维护角色(
trader.senior/trader.junior)与权限(trade.execute)的映射关系 - 开发对应的管理界面供运维人员调整映射规则
- 为避免每次请求查询存储,需实现缓存机制(如Redis)提升性能
适用场景:仅当权限规则需要频繁动态调整,或Entra ID应用角色无法满足复杂权限组合需求时才考虑,否则会增加不必要的系统复杂度。
关键注意事项
- 建议给权限类应用角色设置统一命名规范(如
permission.trade.execute),与传统角色区分开,避免混淆 - 自定义授权属性需注意Entra ID令牌中
roles声明的大小写(通常为小写),确保校验逻辑准确
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

