Azure B2C集成主租户API时无法请求自定义Scope问题咨询
Azure B2C与主租户API集成问题排查与配置方案
环境配置
- 主租户(TMain):核心Azure租户,已注册前端应用与后端API,API暴露自定义Scope和角色,前端已获对应权限
- B2C租户(TB2C):关联TMain订阅创建的B2C租户,已注册前端应用(B2CFE),通过
az ad sp create --id some-custom-id-guid导入TMain的API为企业应用,为B2CFE分配权限并配置支持Microsoft Account登录的用户流
问题现象
使用以下C#测试代码,以TMain全局管理员登录后无法请求自定义Scope,报错:AADB2C90117: The scope 'api://scope-from-enterprise-app-in-B2C/api.read' provided in the request is not supported.
class Program { // Replace these values with your own private const string ClientId = "TB2C-new-app-client-id"; private const string TenantName = "TB2C-Name"; private const string TenantId = "TB2C-ID"; private const string Authority = $"https://{TenantName}.b2clogin.com/tfp/{TenantName}.onmicrosoft.com/B2C_1_main"; private static readonly string[] Scopes = { "api://scope-from-enterpise-app-in-B2C/api.read" }; static async Task Main(string[] args) { try { // Create the MSAL public client application var app = PublicClientApplicationBuilder .Create(ClientId) .WithAuthority(Authority) .WithRedirectUri("http://localhost") .Build(); // Acquire a token interactively var result = await app.AcquireTokenInteractive(Scopes) .ExecuteAsync(); // Display tokens Console.WriteLine("Access Token:"); Console.WriteLine(result.AccessToken); Console.WriteLine("\nID Token:"); Console.WriteLine(result.IdToken); } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.Message}"); } Console.WriteLine("\nPress any key to exit..."); Console.ReadKey(); } }
期望架构
需实现以下两种方案之一,且均需支持用户模拟、API应用级权限、角色授权(令牌含角色声明):
- 选项A:单个前后端应用,同时支持内部用户(TMain)与B2C用户认证,不同用户对应不同后端Scope
- 选项B:两个独立前端连接同一后端,各前端使用不同权限/Scope集合
疑问解答与配置方案
1. 为何TMain用户登录TB2C无法请求自定义Scope?
- B2C租户导入主租户API为企业应用后,仅完成了服务主体同步,但自定义Scope未被B2C身份验证服务识别。B2C仅认可自身租户内显式暴露的Scope,直接引用主租户API的Scope格式会被判定为无效。
- TMain全局管理员通过B2C用户流登录时,身份为外部用户(Microsoft Account身份提供者),B2C无法自动关联主租户API的权限分配,需确保TB2C内的企业应用已正确配置并暴露Scope,且B2CFE已获对应权限。
2. 架构配置方案
通用前置操作
- 在TB2C中,找到导入的TMain-API企业应用,进入对应的应用注册页面:
- 设置应用ID URI(可使用默认值
api://{SP-ID}) - 前往公开API,添加需暴露的自定义Scope(如
api.read)并启用
- 设置应用ID URI(可使用默认值
- 为B2CFE分配该Scope的权限,完成管理员同意(若需)
- 修正测试代码中的Scope为TB2C内企业应用的格式:
api://{TB2C-Imported-API-SP-ID}/api.read
选项A:单个前后端应用支持多用户认证
前端配置
- 注册多租户前端应用,同时支持两个Authority:
- 内部用户:使用TMain的AAD地址
https://login.microsoftonline.com/{TMain-Tenant-ID} - B2C用户:使用TB2C的用户流地址
https://{TB2C-Name}.b2clogin.com/tfp/{TB2C-Name}.onmicrosoft.com/{User-Flow-Name}
- 内部用户:使用TMain的AAD地址
- 根据用户选择的登录方式切换Authority,请求对应租户的API Scope:
- 内部用户:请求TMain-API原生Scope
api://{TMain-API-Client-ID}/api.read - B2C用户:请求TB2C导入的企业应用Scope
api://{TB2C-Imported-API-SP-ID}/api.read
- 内部用户:请求TMain-API原生Scope
后端API配置
- 在TMain-API中配置两个受众(Audience):自身Client ID和TB2C导入的企业应用SP ID
- 实现权限验证逻辑:
- 通过令牌
iss字段区分用户来源(TMain或TB2C) - 根据
scp(Scope)或roles字段授权访问
- 通过令牌
- 确保前端应用在两个租户中均被授予用户模拟权限,令牌包含
impersonation相关声明
选项B:两个独立前端连接同一后端
前端配置
- 内部前端(TMain-FE):注册在TMain中,使用TMain的AAD Authority,请求TMain-API原生Scope,分配全量权限(如
api.read+api.write) - B2C前端(B2CFE):注册在TB2C中,使用B2C用户流Authority,请求TB2C导入的企业应用Scope,分配受限权限(如仅
api.read)
后端API配置
- 同选项A,配置API接受两个受众(TMain-API Client ID和TB2C导入的SP ID)
- 在TMain-API中定义角色(如
InternalAdmin、ExternalUser),分别分配给两个前端应用 - 令牌验证时,通过
roles字段判断权限,通过iss字段确认用户来源
内容的提问来源于stack exchange,提问作者quain
相关产品推荐
相关产品推荐

