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

迁移至ArmClient:如何从ServiceClientCredential获取TokenCredential?

迁移至ArmClient时,基于证书认证的TokenCredential实现方案

核心问题定位

DefaultAzureCredential会自动适配本地Visual Studio登录的认证场景,但在流水线的证书认证环境中,需要显式使用ClientCertificateCredential(Azure.Core提供的证书专属TokenCredential实现),而非依赖DefaultAzureCredential的自动发现逻辑。

代码实现示例

1. 从本地文件加载证书创建Credential

流水线中可通过环境变量传递证书路径与密码,实现无硬编码的认证配置:

using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using System.Security.Cryptography.X509Certificates;

// 从环境变量读取认证参数
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var certPath = Environment.GetEnvironmentVariable("AZURE_CERT_PATH");
var certPassword = Environment.GetEnvironmentVariable("AZURE_CERT_PASSWORD");

// 加载证书,添加存储标志避免流水线权限问题
var certificate = new X509Certificate2(
    certPath, 
    certPassword, 
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

// 创建证书认证的TokenCredential
var credential = new ClientCertificateCredential(tenantId, clientId, certificate);

// 初始化ArmClient
var armClient = new ArmClient(credential);

2. 从Azure Key Vault加载证书(流水线推荐方案)

若证书存储在Key Vault,可先通过SecretClient获取证书私钥,再创建Credential:

using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.Security.KeyVault.Secrets;
using System.Security.Cryptography.X509Certificates;

var kvName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
var kvUri = new Uri($"https://{kvName}.vault.azure.net/");

// 用DefaultAzureCredential访问Key Vault(流水线可通过托管身份配置)
var secretClient = new SecretClient(kvUri, new DefaultAzureCredential());

// 获取Key Vault中存储的证书私钥(证书会以Secret形式保存)
var certSecret = await secretClient.GetSecretAsync("your-certificate-name");
var certBytes = Convert.FromBase64String(certSecret.Value.Value);
var certificate = new X509Certificate2(certBytes);

// 创建Credential并初始化ArmClient
var credential = new ClientCertificateCredential(
    Environment.GetEnvironmentVariable("AZURE_TENANT_ID"),
    Environment.GetEnvironmentVariable("AZURE_CLIENT_ID"),
    certificate);

var armClient = new ArmClient(credential);

流水线配置要点

  • 必设环境变量:AZURE_TENANT_ID、AZURE_CLIENT_ID,以及证书路径/密码(或Key Vault名称)
  • 若使用自签名证书,需确保流水线运行环境信任该证书,或通过X509Certificate2的存储标志绕过临时权限限制

多环境兼容优化

如果需要同时支持本地VS登录和流水线证书认证,可继续使用DefaultAzureCredential,通过配置让它自动适配场景:

using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;

var credentialOptions = new DefaultAzureCredentialOptions
{
    ExcludeVisualStudioCredential = false, // 保留本地VS认证
    ExcludeClientCertificateCredential = false // 启用证书认证逻辑
};

var credential = new DefaultAzureCredential(credentialOptions);
var armClient = new ArmClient(credential);

此时流水线只需设置AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_CERTIFICATE_PATH、AZURE_CLIENT_CERTIFICATE_PASSWORD,DefaultAzureCredential会自动选择证书认证方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:06:05