ASP.NET Core Web API集成AAD认证调用报401令牌签名无效错误
AAD集成场景下Vue3调用ASP.NET Core Web API返回401排查指南
调用接口返回401未授权时,响应头WWW-Authenticate字段返回如下错误:
Bearer error="invalid_token", error_description="The signature is invalid"
可按照以下优先级逐一排查:
核心高频诱因(90%以上此类问题由以下配置错误导致)
- 前端获取令牌的scope配置错误
必须使用后端Web API在AAD中暴露的委托权限scope作为令牌请求的资源参数,格式为api://<后端API注册的ClientId>/<自定义scope名>。禁止使用Microsoft Graph相关scope(如User.Read)、前端SPA自身的ClientId作为scope值,这类scope拿到的令牌是签发给其他资源的,后端用自身对应的公钥验签必然返回签名无效。 - 令牌受众(aud)不匹配
直接把前端拿到的JWT令牌中间payload段做base64解码,检查aud字段值,必须和后端appsettings.json中AzureAd节点配置的ClientId完全一致,字符偏差、错填为前端应用ClientId都会直接触发验签失败。
AAD应用注册配置校验项
- 确认后端API对应的应用注册类型为Web API,而非单页应用(SPA)、桌面客户端等其他类型;在「公开API」配置页设置的应用ID URI,必须和前端请求令牌时使用的资源地址完全匹配。
- 确认前端SPA对应的应用注册,已经被授予后端API的对应委托权限,避免租户特殊配置下的令牌签发异常。
- 确认
TenantId配置为AAD租户的GUID格式值,不要填租户域名、错误租户ID,否则拿到的令牌为其他租户签发,公钥不匹配会直接报签名错误。
后端配置与环境校验
- 清理冗余配置:当前
appsettings.json的AzureAd节点同时存在Secret和ClientSecret两个密钥字段,属于连接服务自动生成的冗余项,仅保留ClientSecret字段即可,删除多余的Secret字段避免配置读取异常。现有配置参考如下:
builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches();
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户GUID", "ClientId": "后端API的应用ClientId", "Domain": "你的租户域名", "CallbackPath": "/signin-oidc", "ClientSecret": "后端API的客户端密钥", "ClientCertificates": [] }
- 校验服务器时间:后端部署服务器的系统时间偏差不能超过5分钟,JWT验签会校验令牌生效、过期时间,时间偏差过大也会被判定为令牌无效。
- 确认元数据拉取正常:如果后端部署在内网/代理环境,需要保证服务能正常访问AAD的OpenID Connect元数据地址,拉取对应租户最新的签名公钥;如果是离线环境,需要手动配置最新签名公钥,旧公钥验签新令牌会直接报签名错误。
令牌传输校验
- 解码JWT的header段,确认
alg字段值为RS256,AAD默认给公共客户端签发RS256非对称签名令牌,若返回HS256算法的令牌说明令牌获取流程完全错误。 - 检查请求头格式:Authorization头必须符合
Bearer <完整JWT令牌>格式,Bearer和令牌之间保留一个半角空格,令牌前后不能有多余引号、换行、转义字符,避免截断导致的验签失败。
内容的提问来源于stack exchange,提问作者Adam Semel
相关产品推荐
相关产品推荐

