问题陈述:在网络/控制台 c# 应用程序中以编程方式检索和使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。
我了解您可以在 AAD 中注册应用并使用其客户端 ID 和客户端密钥以编程方式生成广告令牌,该令牌可用于调用/访问 Azure Key Vault 密钥。
我的困惑是客户端机密本身是一个敏感的“密码”,您希望将其存储在密钥保管库中。一旦有人知道客户端机密,他们就可以访问密钥保管库中的所有机密。那么创建一个新的秘密(客户端秘密)来存储和访问原始秘密有什么意义呢? (有人可以解释一下这背后的逻辑吗?谢谢!
答案 0 :(得分:8)
这是引导的问题。 如何在不使用机密的情况下访问机密存储?
如果您在 Azure 中运行您的应用程序,答案非常简单。 使用 Managed identities。
如果不在 Azure 中运行,交互式应用程序可以代表当前用户访问 Key Vault。 这确实要求用户有权访问 Key Vault 机密。
另一种方法是使用证书而不是客户端机密。
答案 1 :(得分:1)
如果您在 Azure 上托管您的应用程序,您可以使用托管标识在服务之间执行身份验证。 完成 Azure 配置后,您需要在应用中添加以下内容:它只需要存储 Azure KeyVault URI - 因为 env 变量会更好。
以下代码将 Azure KeyVault 与 AppConfiguration 一起使用,因此本地 appsettings.json
文件为空:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((hostingContext, configBuilder) =>
{
if (hostingContext.HostingEnvironment.IsDevelopment()) return;
AddAzureKeyVault(configBuilder);
var configRoot = configBuilder.Build();
AddAzureAppConfiguration(configBuilder, configRoot);
});
webBuilder.UseStartup<Startup>();
});
private static void AddAzureKeyVault(IConfigurationBuilder configBuilder)
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
configBuilder.AddAzureKeyVault(
$"https://{keyVaultName}.vault.azure.net/",
keyVaultClient,
new DefaultKeyVaultSecretManager());
}
private static void AddAzureAppConfiguration(IConfigurationBuilder configBuilder, IConfigurationRoot configRoot)
{
var appConfigName = configRoot["AppConfiguration-Name"];
configBuilder.AddAzureAppConfiguration(appConfigName);
}