You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:08:19