.NET 5 Web API遇Azure AD认证401,Bearer Token签名无效如何解决
解决方案
核心错误点及修复步骤
- 配置节点不匹配+拼写错误
appsettings.json中的配置节点名为AzureAd,但Startup.cs中读取的是AzureAdB2C前缀的配置项,导致Audience、Authority等核心验证参数全部读取错误,是签名验证失败的首要原因。另外配置中存在拼写错误TanantId,正确应为TenantId。
修复操作:将Startup.cs中所有AzureAdB2C前缀的配置读取改为AzureAd,同时修正appsettings.json中的拼写错误。 - Authority端点版本不匹配
appsettings中配置的Issuer是v2.0端点(后缀带/v2.0),但Startup中拼接Authority时未添加该后缀,导致JWT发行方验证不通过。
修复操作:修改Authority拼接逻辑:jwtConfig.Authority = $"{configuration["AzureAd:Instance"]}{configuration["AzureAd:TenantId"]}/v2.0"; - 验证参数缺失
当前TokenValidationParameters未指定ValidIssuer,会导致发行方验证失败。
修复操作:在TokenValidationParameters配置中补充:ValidIssuer = configuration["AzureAd:Issuer"] - Angular端Token获取校验
- 确认请求token时使用的scope是Web API暴露的scope(格式为
api://<Web API ClientId>/<ScopeName>,即你配置截图中对应的scope值),不要使用Microsoft Graph的scope(如User.Read),否则获取到的是Graph的访问令牌,无法通过自有API的签名验证。 - 确认传递的
this.token是调用acquireTokenSilent/acquireTokenPopup获取到的accessToken,不是idToken,idToken仅用于前端身份验证,不能用于调用后端API。
- 确认请求token时使用的scope是Web API暴露的scope(格式为
修改后核心代码参考
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(jwtConfig => { jwtConfig.Audience = configuration["AzureAd:ResourceId"]; jwtConfig.Authority = $"{configuration["AzureAd:Instance"]}{configuration["AzureAd:TenantId"]}/v2.0"; jwtConfig.SaveToken = true; jwtConfig.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidAudience = jwtConfig.Audience, ValidIssuer = configuration["AzureAd:Issuer"] }; // 其余Events配置保持不变 });
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

