调用Azure AD注册API返回invalid_token签名无效问题排查
Azure AD客户端凭据流调用受保护API返回401 invalid_token(签名无效)排查
问题场景
计划使用客户端凭据流(client credential flow)保护自有API,前置已完成配置:
- 在Azure Active Directory中注册应用
- 为应用添加
User.ReadAll权限并完成管理员授权 - 生成对应客户端密钥(client secret)
API项目核心代码如下:
Program.cs 鉴权配置
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
appsettings.json AzureAD节点配置
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "myazure.onmicrosoft.com", "TenantId": "4b49fd73-aaaa-zzzz-xxxx-101385c03aaa", "ClientId": "226a511d-8888-7777-6666-c1897e7d4ccc" } }
受保护接口控制器
[Authorize] [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase
故障现象
向https://login.microsoftonline.com/mytenant/oauth2/v2.0/token端点发起POST请求获取访问令牌,经jwt.ms校验令牌格式无异常,但使用该令牌调用API时返回401状态码,错误详情:
Bearer error="invalid_token", error_description="The signature is invalid"
根因与修复方案
该错误由Azure AD的应用注册角色隔离机制导致:Azure AD明确区分API服务端注册和客户端调用方注册两类应用实体,无法直接使用API自身对应的应用注册获取令牌调用自身。
修复操作步骤:
- 保留原有配置在API项目中的Azure AD应用注册,该应用是API服务端的身份标识,仅用于令牌签名校验,不要使用它的客户端ID/密钥发起令牌请求
- 单独为API的消费方(即调用API的后端服务/客户端)注册新的Azure AD应用,为该消费方应用生成客户端密钥
- 回到原有API服务端应用的注册页面,进入「公开API」菜单,定义对应的应用权限(应用角色)
- 进入新注册的消费方应用的「API权限」菜单,添加刚才在API服务端应用下定义的自定义权限,完成管理员授权
- 消费方发起令牌请求时,
scope参数填写自定义API权限的完整标识符,不要使用User.ReadAll这类属于Microsoft Graph的无关权限
配置差异提示:该逻辑与Keycloak存在明显区别,Keycloak仅需完成API侧配置即可,无需单独为调用方创建独立客户端实体,从Keycloak迁移到Azure AD鉴权时极易踩中该问题。
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

