Azure AD中SaaS应用自定义权限配置及后续实现咨询
SaaS多租户应用自定义权限与访问管控实现方案
一、设计并配置自定义权限(Azure AD端)
1. 定义应用角色(用户/组级权限)
- 进入Azure AD应用注册,找到目标应用,切换到应用角色页面。
- 点击"创建应用角色",针对每个需管控的端点设计对应权限,例如:
- 名称:
Orders.Read,显示名称:"订单只读访问",描述:"允许用户查看本租户下的订单数据",成员类型选择"用户/组"。 - 名称:
Orders.Write,显示名称:"订单读写访问",描述:"允许用户创建、修改本租户下的订单数据"。
- 名称:
- 保存后,可在Azure AD的用户/组设置中,给特定用户或组分配对应角色。
2. 定义API自定义范围(客户端/细粒度权限)
- 切换到公开API页面,点击"添加范围":
- 设置范围名称(如
Orders.FullAccess)、显示名称、描述,根据多租户需求选择权限同意范围(如"任何组织目录中的帐户")。 - 保存后,该范围会作为API权限选项,供客户端请求时指定。
- 设置范围名称(如
二、确认多租户配置正确性
- 在应用注册概述页面,检查"支持的帐户类型"是否设置为任何组织目录中的帐户(若需支持外部来宾,可选择包含个人Microsoft帐户的选项)。
- 确保已配置的重定向URI为内部服务器可访问地址,生产环境必须使用HTTPS,测试环境可临时使用HTTP(不推荐)。
三、后端实现权限验证与端点管控
1. 登录流程中请求权限
- 在OAuth2.0/OpenID Connect授权请求的
scope参数中,包含自定义权限范围与基础OpenID Connect范围,示例:scope=openid profile api://<你的应用ID>/Orders.Read
2. 端点权限校验
- 在后端每个需管控的端点,解析请求携带的Access Token,检查权限声明:
- 应用角色对应声明类型为
roles,自定义API范围对应声明类型为scp。
- 应用角色对应声明类型为
- 伪代码示例(.NET环境):
// 校验订单写权限 var hasOrderWritePermission = HttpContext.User.Claims.Any(c => c.Type == "roles" && c.Value == "Orders.Write"); if (!hasOrderWritePermission) { return StatusCode(403, "无订单修改权限"); }
四、租户隔离逻辑实现
- 用户登录后,从ID Token中提取
tid(租户ID)声明,绑定到当前请求上下文或用户会话。 - 在数据访问层,所有查询操作必须带上租户ID作为过滤条件,确保用户仅能访问所属租户数据,示例:
SELECT * FROM Orders WHERE TenantId = @CurrentTenantId
- 结合租户ID与应用角色,实现租户级权限隔离,例如限制租户管理员仅能管理本租户内的权限分配。
五、测试与验证
- 使用Azure AD应用注册中的"快速启动"工具生成测试代码,模拟不同租户、不同权限的用户登录,检查返回的Token中是否包含预期权限声明。
- 针对每个端点,分别用拥有对应权限和无权限的用户发起请求,验证权限管控逻辑是否生效。
内容的提问来源于stack exchange,提问作者Ankit Tibriwal
相关产品推荐
相关产品推荐

