咨询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_credentialsclient_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
相关产品推荐
相关产品推荐

