使用MSAL与JWT处理多受众及.NET Core API认证401问题
两个.NET Core API通过Microsoft Entra认证通信的401问题
我遇到两个基于.NET Core的API通信认证难题,两个API均使用Microsoft Entra验证请求中的JWT承载令牌。我通过Client Secret和TenantId从Entra服务器获取JWT令牌(客户端凭证流),这一步能正常完成,但将该令牌用于调用另一个API时,收到401未授权响应。
架构示意图

接收API(第二个API)的认证配置
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.Authority = configuration.GetValue<string>("Authentication:Authority"); }); services.AddOptions<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme) .Configure<IConfiguration>((options, configuration) => { configuration.GetSection("Authentication").Bind(options); }); services.AddAuthorization();
令牌获取的ConfidentialClient实现
public class ConfidentialClient : IConfidentialClient { private readonly AzureADOptions _ADOConfig; // 该对象会在内存中缓存令牌 - 需保持单例 private readonly IConfidentialClientApplication clientApp; public ConfidentialClient(IOptions<AzureADOptions> options) { this._ADOConfig = options.Value; this.clientApp = ConfidentialClientApplicationBuilder.Create(_ADOConfig.ClientId) .WithClientSecret(_ADOConfig.ClientCredentials.First().ClientSecret) .Build(); } public async Task<string> GetToken() { // 请求时指定租户级别的权限中心 var authResult = await this.clientApp.AcquireTokenForClient(scopes: new[] { _ADOConfig.Scopes.First() }) .WithTenantId(_ADOConfig.TenantId) .ExecuteAsync(); return authResult.AccessToken; } }
问题分析
前端(第三方应用)使用MS登录获取的令牌与该API通信时一切正常,但用ConfidentialClient获取的令牌却触发401。对比两种令牌后发现,核心差异在于Audience(受众):通过ConfidentialClient获取的令牌受众为通用型,与接收API的JWT认证策略配置的受众(及前端令牌的受众)不一致,这应该是导致令牌被拒绝的原因。
提问
- 是否可以为ConfidentialClient配置特定受众?
- 能否将JWTBearer认证策略配置为可接受多个受众?
内容的提问来源于stack exchange,提问作者Ignacio Iron Babbini
相关产品推荐
相关产品推荐

