使用OBO流获取令牌时遭遇AADSTS50013签名验证失败错误
解决OBO令牌流转中的AADSTS50013错误及受众(aud)问题
核心错误分析(AADSTS50013)
错误提示签名验证失败,原因是Azure AD找到对应密钥但无法完成签名校验,重点排查以下几点:
1. 确认API应用注册的密钥/证书有效性
- 登录Azure Portal,进入API应用注册的证书和密码页面,对比错误信息中提到的密钥有效期(
Start=11/27/2024 09:04:39, End=11/27/2029 09:04:39),找到匹配的密钥/证书。 - 检查该密钥的指纹(Thumbprint)是否与错误中的
Thumbprint of key used by client: 'XXXX'完全一致,若不匹配则说明使用了错误的凭据,需更新客户端所用密钥。 - 若使用证书,确保证书包含完整私钥,且未过期或被篡改。
2. 验证令牌签名算法配置
进入API应用注册的令牌配置页面,确认access token签名算法设置为RS256(默认应为该值,需避免被修改为HS256)。算法不匹配会直接导致签名验证失败。
受众(aud)字段异常问题
用户access token的aud为GUID而非api://ID_OF_THE_API_ENDPOINT,原因是SPA请求token时使用了错误的scope格式:
- 需确保SPA请求access token时,scope参数为完整的应用ID URI格式:
api://<API_APP_ID>/access_as_user,而非直接使用API应用的GUID。 - 重新获取用户access token后,检查
aud字段是否变为api://<API_APP_ID>,这是OBO流程中可被验证的有效受众。
OBO令牌请求参数修正
你的Postman请求存在两个关键错误:
1. 请求方法错误
获取OBO令牌必须使用POST方法,而非GET。GET方法无法正确传递请求体参数,会导致Azure AD解析失败。
2. 客户端身份参数错误
OBO流程中,发起请求的客户端应为你的API应用注册(而非SPA),因此:
client_id需填写API应用的ID,而非SPA的ID;client_secret需填写API应用注册中生成的客户端密码,而非SPA的凭据(SPA作为公共客户端通常无client_secret)。
修正后的请求参数(POST请求体,x-www-form-urlencoded格式)
grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer scope: api://<API_APP_ID>/access_as_user client_secret: <API_APP_CLIENT_SECRET> assertion: <VALID_USER_ACCESS_TOKEN_WITH_CORRECT_AUD> requested_token_use: on_behalf_of client_id: <API_APP_ID>
内容的提问来源于stack exchange,提问作者Jeppe Christensen
相关产品推荐
相关产品推荐

