如何解决Blazor调用ASP.NET API时的aud无效声明错误?
当然可以使用与API端点域名不同的aud令牌,aud(受众)是API的逻辑标识符,和API实际部署的域名没有强制绑定要求,很多企业场景里都会用自定义域名作为API的aud,完全合法。
你的问题大概率不是域名不一致导致的,而是更换aud后的配置遗漏,按以下步骤排查:
检查ASP.NET API的JWT验证配置
确保API端的验证逻辑接受新的域名作为合法受众。在Program.cs的认证配置里,要把新的域名添加到ValidAudiences列表中:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://login.microsoftonline.com/你的租户ID"; options.TokenValidationParameters = new TokenValidationParameters { // 包含你新设置的域名aud,也可以保留旧的aud做兼容 ValidAudiences = new[] { "https://你的新域名", "api://旧GUID/write.access" } }; });如果API使用Microsoft.Identity.Web库,要确保
AddMicrosoftIdentityWebApi时指定正确受众:builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches();对应appsettings.json配置:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户ID", "ClientId": "API的客户端ID", "Audience": "https://你的新域名" }验证Entra中的API范围配置
更换Application ID URI后,要在API的「公开API」页面重新创建write.access范围,确保新域名对应的URI下存在该范围,且Blazor应用已被授予该范围的权限。检查Blazor应用的令牌请求范围
Blazor应用请求令牌时,要使用新域名对应的范围(比如https://你的新域名/write.access),而非旧的api://GUID/write.access。确认Blazor配置文件(如appsettings.json)里的下游API范围已更新正确。解码令牌确认内容
用jwt.ms解码Blazor获取的JWT令牌,检查aud字段是否为你设置的新域名,scp字段是否包含正确的write.access范围。如果令牌aud不对,说明Blazor的下游API配置未生效,需重新保存Entra配置并重启应用。
另外补充:自定义声明和aud是否用域名没有必然关联,之前用api://GUID的aud也可以添加自定义声明,不过既然已切换到域名,补全上述配置即可。
内容的提问来源于stack exchange,提问作者YMC

