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
相关产品推荐
相关产品推荐

