调用Microsoft.Capacity API获取预留订单时遇PassthroughTokenValidationFailed错误
错误场景
在Azure门户沙箱中尝试为拥有Azure计划和预留实例订阅的测试客户列出预留订单,调用API:
GET https://management.azure.com/providers/Microsoft.Capacity/reservationOrders?api-version={{api_version}}
已完成应用授权,能成功获取身份令牌,但收到错误:
{
"error": {
"code": "PassthroughTokenValidationFailed",
"message": "Token validation failed. A passthrough token was detected without proper resource provider context - request correlation identifier 'correlation id'"
}
}
错误原因
该错误核心是令牌缺少目标客户的资源提供者上下文,常见于CSP(云解决方案提供商)合作伙伴代理客户操作的场景。即使直接获取客户AD令牌,若未遵循CSP特定的令牌获取流程,也会导致令牌无法被资源提供者识别。
解决办法
确保令牌的资源/受众正确
获取令牌时,v1端点需指定resource=https://management.azure.com/,v2端点需指定scope=https://management.azure.com/.default。错误的资源值会导致令牌无法关联到Azure管理API的资源上下文。使用CSP代表客户(OBO)流程获取令牌
作为CSP合作伙伴,需通过OBO流程获取代理客户的操作令牌:- 先获取合作伙伴自身应用的令牌(目标资源为
https://management.azure.com/) - 调用OBO端点,传入该令牌、客户租户ID,获取代表客户的操作令牌
此流程会自动注入x-ms-authorization-auxiliary等CSP必需声明,确保令牌具备客户上下文。
- 先获取合作伙伴自身应用的令牌(目标资源为
验证令牌声明
用jwt.ms解码令牌,检查是否包含x-ms-authorization-auxiliary声明(包含客户租户信息)。若缺少该声明,说明令牌获取流程不符合CSP代理要求。确认客户订阅的资源提供者已注册
在客户的订阅中,确保Microsoft.Capacity资源提供者已注册。可通过以下API检查:GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Capacity?api-version=2021-04-01若状态为
NotRegistered,需先调用注册API:POST https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Capacity/register?api-version=2021-04-01检查应用权限配置
确保应用已被授予Microsoft.Capacity/reservationOrders/read权限(应用权限或委派权限),且完成管理员同意(针对委派权限)。
内容的提问来源于stack exchange,提问作者MAS

