Angular5+ASP.NET Core API集成Azure AD B2C受众验证失败问题
这个问题我碰到过好多次,本质就是令牌的受众(Audience)和API验证时配置的有效受众不匹配导致的。咱们一步步来排查和解决:
1. 先检查Angular应用的令牌请求配置
你现在拿到的令牌受众是SPA自己的客户端ID(627684f5-5011-475a-9cbd-55fcdcdf369e),说明Angular请求令牌时,目标资源设成了自己,而不是API。
在Angular的认证配置里(比如app.module.ts或者专门的auth配置文件),找到protectedResourceMap(如果用的是MSAL库),确保你为API端点指定的是API的客户端ID对应的范围:
MsalModule.forRoot({ auth: { clientId: '627684f5-5011-475a-9cbd-55fcdcdf369e', // 这是SPA的客户端ID,没问题 authority: 'https://yourtenant.b2clogin.com/yourtenant.onmicrosoft.com/B2C_1_signupsignin', }, cache: { cacheLocation: 'localStorage', storeAuthStateInCookie: isIE, } }, { protectedResourceMap: new Map([ // 这里要把API端点和API的范围对应起来 ['https://yourapi-domain.com/api', ['https://yourtenant.onmicrosoft.com/ee8b98a0-ae7a-38b2-9e73-d175df22ef4c/access_as_user']] ]) })
这里的关键是范围格式:https://{你的租户域名}/{API的客户端ID}/{权限名称},这样请求到的令牌的aud字段才会是API的客户端ID。
2. 确认ASP.NET Core API的验证配置
在API的appsettings.json里,确保AzureAdB2C的ClientId是API自己的客户端ID(ee8b98a0-ae7a-38b2-9e73-d175df22ef4c):
"AzureAdB2C": { "Instance": "https://yourtenant.b2clogin.com/", "ClientId": "ee8b98a0-ae7a-38b2-9e73-d175df22ef4c", "Domain": "yourtenant.onmicrosoft.com", "SignUpSignInPolicyId": "B2C_1_signupsignin" }
然后在Program.cs(或者Startup.cs)的认证配置里,不要手动指定错误的ValidAudience,默认用配置里的ClientId就好:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
3. 验证令牌内容
你可以在Angular代码里打印出获取到的令牌,解析后查看aud字段,确认它是否变成了API的客户端ID。如果还是SPA的ID,那肯定是Angular的范围配置没改对,再回去检查protectedResourceMap。
4. 检查Azure AD B2C应用注册
- 登录Azure门户,找到你的API应用注册,确认它的客户端ID确实是
ee8b98a0-ae7a-38b2-9e73-d175df22ef4c,并且已经暴露了对应的API权限(比如access_as_user)。 - 再找到SPA的应用注册,在「API权限」里确认已经添加了这个API的权限,并且已经完成了管理员同意(如果是需要的话)。
调整完这些之后,重新登录Angular应用,拿到新的令牌再调用API,应该就能通过受众验证了。
内容的提问来源于stack exchange,提问作者Lukasz

