.NET Core API对接Azure AAD报401 Unauthorized受众无效如何解决
.NET Core API 配置Azure AAD鉴权修改应用URI后报受众无效401解决方案
问题根因
修改Azure AD应用注册的应用程序ID URI后,API侧的JWT令牌校验规则未同步更新,默认仅认可初始格式api://<Client_Id>为合法受众,因此aud字段为新URI的令牌会被判定为无效。
排查&修复步骤
- 先校验Azure AD侧配置正确性
- 进入对应API应用的「公开API」配置页,确认应用程序ID URI已成功保存为
https://xyz.onmicrosoft.com/<<Client_Id>>,无拼写错误、无多余后缀 - 检查请求令牌的客户端应用的API权限配置,确认已申请修改后API对应的权限,未残留旧格式
api://<Client_Id>的权限配置 - 确认请求令牌时传参正确:v2.0端点请求Client Credential/授权码流时,scope参数需使用新URI拼接,即
https://xyz.onmicrosoft.com/<<Client_Id>>/.default(客户端凭据流)或对应委托权限值,不能再使用旧格式的scope
- 进入对应API应用的「公开API」配置页,确认应用程序ID URI已成功保存为
- 更新.NET Core API侧的JWT鉴权配置
如果你是用微软官方提供的Azure AD鉴权集成包,直接修改appsettings.json的AzureAd节点即可:
如果你是手动编写"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "xyz.onmicrosoft.com", "TenantId": "你的Azure租户ID", "ClientId": "API应用对应的ClientId", // 重点修改Audience字段为新的应用程序URI "Audience": "https://xyz.onmicrosoft.com/<<Client_Id>>" }AddJwtBearer鉴权逻辑,直接修改令牌验证参数里的合法受众配置即可:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://login.microsoftonline.com/<<你的租户ID>>/v2.0"; options.TokenValidationParameters = new TokenValidationParameters { // 若需要兼容新旧两种格式的令牌,可将两个值都传入ValidAudiences数组 ValidAudiences = new [] { "https://xyz.onmicrosoft.com/<<Client_Id>>", // 兼容旧格式令牌时打开下方注释 // $"api://{builder.Configuration["AzureAd:ClientId"]}" }, ValidateIssuer = true, ValidIssuer = $"https://sts.windows.net/{builder.Configuration["AzureAd:TenantId"]}/" }; }); - 校验配置生效
改完配置后重启API应用,可先将拿到的access token做本地解码,确认payload里的aud字段值和你配置的合法受众完全一致(注意末尾不要多斜杠、不要有拼写差异),再发起请求即可正常通过鉴权。
踩坑提示:部分场景下如果配置了API多版本或者多环境的受众校验,不要遗漏对应环境的配置项,避免改了开发环境配置但发布到生产环境还是旧值。
内容的提问来源于stack exchange,提问作者Pinkesh Patel
相关产品推荐
相关产品推荐

