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

如何让独立.NET(C#)应用无需AZCL及登录凭证访问Azure Key Vault

独立C# Windows应用无凭证访问Azure Key Vault的解决方案

针对你需要交付给他人的独立Windows应用,无需Azure CLI或用户登录凭证即可访问Key Vault的需求,最可靠的方案是基于Azure AD服务主体的客户端证书认证,核心思路是用证书作为身份凭证,而非明文密钥或用户登录信息。以下是具体实现步骤:

一、前置Azure配置

1. 注册Azure AD应用(服务主体)

  • 登录Azure门户,进入「Azure Active Directory」→「应用注册」→「新注册」
  • 填写应用名称,选择合适的账户类型(如单租户仅面向你的Azure AD用户,多租户则支持外部用户)
  • 注册完成后,记录客户端ID和租户ID(在应用的「概述」页面)

2. 为应用分配Key Vault访问权限

  • 打开你的Key Vault,进入「访问控制(IAM)」→「添加角色分配」
  • 选择所需角色:如「Key Vault Secrets User」(仅读取机密)或「Key Vault Crypto User」(读取密钥),根据你的需求选择
  • 在「成员」页面,选择刚才注册的Azure AD应用作为主体,完成角色分配

3. 创建并配置客户端证书

  • 生成证书:用PowerShell生成自签名证书(生产环境建议用企业CA签发)
    New-SelfSignedCertificate -Subject "CN=YourAppName" -CertStoreLocation "Cert:\CurrentUser\My" -KeySpec Signature -KeyLength 2048
    
  • 上传公钥到Azure AD:导出证书的.cer格式文件(仅公钥),在Azure AD应用的「证书和密码」→「上传证书」中上传该文件
  • 部署证书到目标机器:将包含私钥的证书导出为.pfx格式(设置保护密码),在目标机器上通过certmgr.msc导入到对应存储(如「当前用户→个人」或「本地机器→个人」,取决于应用运行权限)

二、C#代码实现

1. 安装NuGet包

需要两个核心包:

Install-Package Azure.Security.KeyVault.Secrets
Install-Package Azure.Identity

2. 核心代码示例

通过读取环境变量获取配置(避免硬编码),使用证书凭据访问Key Vault:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using System;
using System.Threading.Tasks;

namespace KeyVaultClientApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 从环境变量读取配置,无需硬编码
            var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
            var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
            var certThumbprint = Environment.GetEnvironmentVariable("AZURE_CERT_THUMBPRINT");

            // 初始化证书凭据
            var credential = new CertificateCredential(
                tenantId,
                clientId,
                new ClientCertificateCredentialOptions
                {
                    CertificateThumbprint = certThumbprint,
                    CertificateStorePath = "CurrentUser", // 对应证书存储位置,LocalMachine表示本地机器存储
                    CertificateStoreName = "My"
                });

            // 初始化Key Vault机密客户端
            var vaultUri = new Uri("https://your-key-vault-name.vault.azure.net/");
            var secretClient = new SecretClient(vaultUri, credential);

            // 获取机密示例
            try
            {
                var secret = await secretClient.GetSecretAsync("your-secret-name");
                Console.WriteLine($"获取到机密值:{secret.Value}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"访问Key Vault失败:{ex.Message}");
            }
        }
    }
}

三、目标机器部署配置

在目标Windows机器上完成以下操作:

  1. 导入证书:将包含私钥的.pfx证书导入到指定的证书存储(如「当前用户→个人」)
  2. 设置环境变量:添加三个系统/用户环境变量:
    • AZURE_TENANT_ID:你的Azure AD租户ID
    • AZURE_CLIENT_ID:注册的应用客户端ID
    • AZURE_CERT_THUMBPRINT:证书的指纹(在证书属性的「详细信息」中可查看)

替代方案(企业域场景)

如果应用仅在企业域内交付,且目标机器已加入Azure AD域,可以使用Windows集成身份验证:

  • 给域用户分配Key Vault的访问权限
  • 代码中直接使用DefaultAzureCredential,它会自动尝试Windows身份验证:
    var credential = new DefaultAzureCredential();
    var secretClient = new SecretClient(vaultUri, credential);
    

该方案无需额外配置证书,但要求用户拥有Azure AD身份且机器在域内,不适用于无域环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:25:40