获取OAuth2 AccessToken触发AADSTS900144错误,请求排查
问题分析与修正方案
核心问题
错误AADSTS900144明确指出请求体必须包含grant_type参数,你的代码存在两处关键操作不当:
- 将
grant_type、client_secret这类OAuth2客户端凭证模式的必填参数放到了请求头中,而非要求的请求体内 - 重复添加
Ocp-Apim-Subscription-Key和grant_type,既在HttpHeadersContent里配置,又在HttpClient.DefaultRequestHeaders里添加,造成冗余配置
正确实现方式
OAuth2客户端凭证模式(client_credentials)要求参数以application/x-www-form-urlencoded格式放入请求体,请求头仅需设置必要的内容类型和网关订阅密钥:
// 配置请求头 HttpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cache-Control", "no-cache"); HttpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", SubKeyTest); // 构建请求体的表单参数(核心参数必须放这里) var formParams = new Dictionary<string, string> { { "grant_type", "client_credentials" }, { "client_id", "你的客户端ID" }, // 注意:你代码遗漏了这个必填参数 { "client_secret", ClientSecret }, { "scope", "目标API的权限范围" } // 若API要求权限范围则添加 }; // 包装为符合格式的请求内容 var requestContent = new FormUrlEncodedContent(formParams); // 发送POST请求到Token端点 var response = await HttpClient.PostAsync("你的Azure AD Token端点URL", requestContent); var responseData = await response.Content.ReadAsStringAsync();
关键注意事项
client_id、grant_type、client_secret是客户端凭证模式的三个核心必填参数,必须全部放在请求体中- Azure AD的OAuth2端点不会从请求头读取这些认证参数,仅会解析请求体内容
- 确认Token端点URL正确(通常格式为
https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token)
内容的提问来源于stack exchange,提问作者hopeforall
相关产品推荐
相关产品推荐

