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

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. 架构配置方案

通用前置操作

  1. 在TB2C中,找到导入的TMain-API企业应用,进入对应的应用注册页面:
    • 设置应用ID URI(可使用默认值api://{SP-ID})
    • 前往公开API,添加需暴露的自定义Scope(如api.read)并启用
  2. 为B2CFE分配该Scope的权限,完成管理员同意(若需)
  3. 修正测试代码中的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}
  • 根据用户选择的登录方式切换Authority,请求对应租户的API Scope:
    • 内部用户:请求TMain-API原生Scope api://{TMain-API-Client-ID}/api.read
    • B2C用户:请求TB2C导入的企业应用Scope api://{TB2C-Imported-API-SP-ID}/api.read
后端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:32:38