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

B2C Web API访问多租户机密客户端Web API的认证配置问题

解决方案:解决B2C API调用AAD多租户API的tenant_override_non_aad错误

问题根源

这个错误的核心原因是:你的应用当前使用的是B2C类型的Authority,而MSAL的WithTenantId方法仅支持AAD类型的Authority。当调用CallWebApiForAppAsync访问AAD多租户API时,默认继承了B2C的认证配置,导致权限体系不匹配,触发了MSAL的限制校验。

修复步骤

1. 更新appsettings.json配置

为下游AAD API单独配置AAD专属认证参数,与B2C配置完全区分开:

{
  "AzureAdB2C": {
    // 保留你的B2C原有配置
    "Instance": "https://your-b2c-tenant.b2clogin.com/",
    "Domain": "your-b2c-tenant.onmicrosoft.com",
    "ClientId": "b2c-api-client-id",
    "TenantId": "b2c-tenant-id",
    "SignUpSignInPolicyId": "B2C_1_susi"
  },
  "TenantAApi": {
    "BaseUrl": "https://tenant-a-api.example.com",
    "Authority": "https://login.microsoftonline.com/tenant-a-id", // AAD租户专属Authority
    "ClientId": "b2c-app-in-tenant-a-client-id", // 租户B的B2C应用在租户A中注册的ClientId(或多租户应用ClientId)
    "ClientSecret": "b2c-app-client-secret", // 对应应用的客户端密钥
    "Scopes": "api://tenant-a-api-client-id/.default" // 应用权限Scope,格式为API的ClientId加.default
  }
}

2. 调整Program.cs的服务配置

不要将B2C配置绑定到下游API的TokenAcquisition,改用AddClientCredentialsForDownstreamApi单独配置下游AAD API的客户端凭据流:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(options =>
    {
        builder.Configuration.Bind("AzureAdB2C", options);
    },
    options => 
    { 
        builder.Configuration.Bind("AzureAdB2C", options); 
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    // 为下游AAD API单独配置客户端凭据
    .AddClientCredentialsForDownstreamApi("TenantAApi", options =>
    {
        builder.Configuration.Bind("TenantAApi", options);
    })
    .AddInMemoryTokenCaches();

3. 调用逻辑保持不变

原有的调用代码无需修改,确保TenantAApi指向正确的配置即可:

var response = await _downstreamWebApi.CallWebApiForAppAsync(
    "TenantAApi",
    options =>
    {
        options.HttpMethod = httpMethod;
        options.RelativePath = url;
    }, content);

var responseContent = await response.Content.ReadAsStringAsync();

关键注意事项

  • 租户B的B2C应用需要在租户A的AAD中完成注册(或作为多租户应用被租户A允许访问),并为其授予目标API的应用权限(而非委派权限)。
  • CallWebApiForAppAsync使用的是客户端凭据流,完全依赖应用自身的身份,因此必须配置ClientSecret或证书,不能使用用户上下文相关的权限。

内容的提问来源于stack exchange,提问作者jarodsmk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:45:36