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

咨询ConfidentialClientApplicationBuilder构建Token端点请求的具体方式

问题:如何用curl模拟Entra ID客户端凭证流获取正确受众的Token

我有一个需要通过Entra ID身份验证的API端点,目前使用以下C#代码可以成功获取有效Token并访问该端点:

static async Task Main(string[] args)
{
    HttpClient client = new HttpClient();

    await EnsureAuthorizationHeader(client);

    var res = await client.GetAsync("https://mydomain/myendpoint");
 
}

private static async Task EnsureAuthorizationHeader(HttpClient result)
{
    IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
        .Create(ApplicationId)
        .WithClientSecret(ApplicationSecret)
        .WithAuthority(Instance.TrimEnd('/') + "/" + TenantId)
        .Build();

    string[] scopes = new[] { $"api://{DownstreamApplicationId}/.default" };

    AuthenticationResult authenticationResult;

    authenticationResult = await confidentialClientApplication
        .AcquireTokenForClient(scopes).ExecuteAsync();

    result.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
        "Bearer", authenticationResult.AccessToken
    );
}

这段代码生成的Token中,受众(aud)字段值为:

"aud": "api://[id of my application]",

我尝试用curl请求Token,虽然能拿到Token,但无法访问API,且该Token的aud值为:

"aud": "00000002-0000-0000-c000-000000000000",

目前无法使用Fiddler抓包,想了解ConfidentialClientApplicationBuilder构建的Token端点请求具体是什么样的?


解决方案

ConfidentialClientApplicationBuilder发起的Token请求细节

当调用AcquireTokenForClient时,MSAL会向Entra ID的令牌端点发送POST请求,具体参数如下:

  • 请求URL:{Instance}/{TenantId}/oauth2/v2.0/token(Instance通常为https://login.microsoftonline.com)
  • 请求头:Content-Type: application/x-www-form-urlencoded
  • 请求体参数:
    • grant_type: client_credentials
    • client_id: 你的ApplicationId(客户端ID)
    • client_secret: 你的ApplicationSecret(客户端密钥)
    • scope: api://{DownstreamApplicationId}/.default(与C#代码中完全一致的作用域)

对应的curl命令

确保curl请求的scope参数和C#代码完全匹配,就能拿到受众为目标API的Token,正确命令如下:

curl -X POST "https://login.microsoftonline.com/{TenantId}/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id={ApplicationId}" \
-d "client_secret={ApplicationSecret}" \
-d "scope=api://{DownstreamApplicationId}/.default"

之前curl请求aud错误的原因

你拿到的aud: 00000002-0000-0000-c000-000000000000是Microsoft Graph API的受众ID,说明之前的curl请求中scope参数设置的是Graph相关值(比如https://graph.microsoft.com/.default),而非目标API的api://{DownstreamApplicationId}/.default,导致Token受众不匹配,无法访问你的API。


内容的提问来源于stack exchange,提问作者Mathias F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:12:47