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

如何通过编程无交互获取Azure AD授权令牌?

问题分析与解决方案

首先明确:无交互的客户端凭证模式(Client Credential Flow)不会返回授权码。授权码是授权码流程(Authorization Code Flow)的产物,该流程必须经过用户登录授权,无法实现无交互。你当前使用的客户端凭证模式,本身就是直接获取访问令牌,这是该模式的正常行为。

如果你实际需求是获取用于调用目标API的访问令牌(可能混淆了"授权令牌"和"访问令牌"的术语),可以按以下优化方案调整:

1. 替换ADAL为MSAL(推荐)

ADAL(Active Directory Authentication Library)已停止维护,建议使用MSAL(Microsoft.Identity.Client),它支持Azure AD v2.0端点,功能更完善。

2. MSAL客户端凭证模式代码示例

using Microsoft.Identity.Client;

string clientId = "你的客户端ID";
string clientSecret = "你的客户端密钥";
string tenantId = "你的租户ID";
// 目标API的范围:如果是v2.0端点,格式为 {API的ClientID}/.default;如果是v1.0端点,直接填API的受众URL
string apiScope = "https://your-api-endpoint/.default";

var app = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

// 获取访问令牌
var result = await app.AcquireTokenForClient(new[] { apiScope })
    .ExecuteAsync();

// 访问令牌在result.AccessToken中
Console.WriteLine(result.AccessToken);

3. 关键注意事项

  • 确保你要调用的API已配置应用权限(而非委托权限),并已在Azure AD中为你的客户端应用授予该权限。
  • 如果目标API是v1.0的Azure AD资源,apiScope可以直接填API的受众URL(比如https://graph.microsoft.com);如果是v2.0资源,必须用{API ClientID}/.default的格式。
  • 客户端凭证模式获取的访问令牌,是基于应用身份的,不是用户身份,所以只能访问允许应用直接调用的API资源。

如果你确实需要授权码(比如要实现授权码流程),那无法避免用户交互,必须引导用户到Azure AD登录页获取授权码,再用授权码兑换访问令牌。

内容的提问来源于stack exchange,提问作者Mehdi Sheikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:25:30