本地从Azure Key Vault获取密钥作为环境变量(C#)
本地访问Azure Key Vault密钥并用作测试环境变量的方案
你没法直接在Settings.runsettings里引用Azure Key Vault密钥,得通过本地身份验证 + 代码/命令行预加载密钥的方式实现,具体步骤如下:
1. 配置本地访问Key Vault的权限
- 先确保本地已登录Azure:用Azure CLI执行
az login,或者在Visual Studio/Azure PowerShell里登录你的Azure账号。 - 在Azure Portal的目标Key Vault中,给当前登录的用户分配Key Vault Secrets User角色(至少要有
secrets/get权限),确保能读取密钥。
2. 修改Settings.runsettings文件
把硬编码的密钥值替换为空占位符,避免敏感信息进代码仓库:
<RunSettings> <RunConfiguration> <!-- 其他配置 --> <EnvironmentVariables> <MySecret></MySecret> </EnvironmentVariables> <!-- 其他配置 --> </RunConfiguration> </RunSettings>
3. 两种加载密钥的方法
方法一:在测试初始化代码中读取密钥并设置环境变量
这种方法不需要手动执行命令,测试启动时自动拉取密钥:
- 给测试项目安装两个NuGet包:
dotnet add package Azure.Security.KeyVault.Secrets dotnet add package Azure.Identity - 创建测试初始化类(以xUnit为例,NUnit可对应使用
[SetUpFixture]):using Azure.Identity; using Azure.Security.KeyVault.Secrets; using System; public class TestSetupFixture : IDisposable { public TestSetupFixture() { // 替换成你的Key Vault地址 var keyVaultUri = new Uri("https://你的密钥保管库名称.vault.azure.net/"); // DefaultAzureCredential会自动用本地已登录的身份验证 var secretClient = new SecretClient(keyVaultUri, new DefaultAzureCredential()); // 读取Key Vault中的目标密钥(替换成你的密钥名称) var secret = secretClient.GetSecret("MySecretName"); // 设置环境变量,覆盖runsettings中的空值 Environment.SetEnvironmentVariable("MySecret", secret.Value.Value); } public void Dispose() { // 清理逻辑(如果需要) } } - 在测试集合中引用这个初始化类,确保测试运行前执行:
[CollectionDefinition("TestCollection")] public class TestCollection : ICollectionFixture<TestSetupFixture> { // 无需额外代码,仅用于标记集合 } - 给测试类添加
[Collection("TestCollection")]特性,启动时自动触发初始化。
方法二:用Azure CLI预加载环境变量后运行测试
适合不想修改测试代码的场景,手动执行命令加载密钥:
- 在Windows PowerShell中执行:
# 从Key Vault读取密钥值 $secretValue = az keyvault secret show --name MySecretName --vault-name 你的密钥保管库名称 --query value -o tsv # 设置环境变量 $env:MySecret = $secretValue # 运行测试 dotnet test - 在Linux/macOS终端中执行:
# 读取密钥并设置环境变量,然后运行测试 export MySecret=$(az keyvault secret show --name MySecretName --vault-name 你的密钥保管库名称 --query value -o tsv) dotnet test
这样就能彻底把敏感密钥从代码仓库中移除,本地测试时安全地从Key Vault拉取密钥作为环境变量使用。
内容的提问来源于stack exchange,提问作者kdeez
相关产品推荐
相关产品推荐

