如何在Azure Data Factory Web活动中通过证书获取AAD访问令牌
在Azure Data Factory中使用Key Vault存储的证书获取AAD访问令牌的替代方案
方法1:通过自定义活动(Custom Activity)实现
- 准备自托管集成运行时(Self-Hosted IR),确保其所在机器可访问Key Vault与AAD
- 编写C#控制台程序,核心逻辑:
- 用
Azure.Security.KeyVault.Certificates库从Key Vault读取证书(需确保ADF托管标识或自托管IR标识拥有Key Vault证书读取权限) - 借助
Microsoft.Identity.Client库,以证书为凭据构造IConfidentialClientApplication实例 - 调用
AcquireTokenForClient方法获取目标资源的访问令牌
- 用
- 将编译后的可执行文件上传至Azure Blob Storage,配置ADF的Blob存储链接服务
- 创建自定义活动,指定可执行文件路径与集成运行时,运行后即可获取令牌,后续可传递给其他活动使用
方法2:借助Azure Function作为中间代理
- 创建HTTP触发的Azure Function,启用系统分配托管标识,给该标识配置两项权限:
- Key Vault的
Certificate Get权限,允许读取目标证书 - 目标AAD资源的访问权限(需确保服务主体证书可用于请求该资源令牌)
- Key Vault的
- 在Function中编写核心代码:
using Azure.Security.KeyVault.Certificates; using Microsoft.Identity.Client; var client = new CertificateClient(new Uri("https://your-keyvault.vault.azure.net/"), new DefaultAzureCredential()); var cert = await client.DownloadCertificateAsync("your-cert-name"); var app = ConfidentialClientApplicationBuilder .Create("service-principal-client-id") .WithTenantId("your-tenant-id") .WithCertificate(cert.Value) .Build(); var result = await app.AcquireTokenForClient(new[] { "https://target-resource/.default" }) .ExecuteAsync(); return new OkObjectResult(result.AccessToken); - 在ADF的Web活动中调用该Function的端点,直接获取返回的访问令牌,还可在Function中添加令牌缓存逻辑减少重复请求
方法3:修正Web活动的证书认证配置(解决之前的失败问题)
如果之前直接用Web活动失败,大概率是配置细节遗漏,按以下步骤调整:
- 确保ADF的托管标识拥有Key Vault的
Certificate Get权限 - 在ADF中创建Key Vault链接服务,配置完成后,在Web活动的认证选项中选择
Client Certificate:- 证书字段选择从Key Vault链接服务获取的目标证书
- 构造AAD令牌请求:
- 请求URL:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token - 请求方法:POST
- 请求Body(x-www-form-urlencoded格式):
grant_type=client_credentialsclient_id={服务主体Client ID}scope={目标资源URI}/.default
- 请求URL:
- 发送请求后,解析响应中的
access_token字段即可得到所需令牌
内容的提问来源于stack exchange,提问作者Prashanth Kumar
相关产品推荐
相关产品推荐

