[英]Access Azure Key Vault stored secret using application not deployed in Azure
[英]Access azure key vault secret with application client secret
問題陳述:在 Web/控制台 c# 應用程序中以編程方式檢索和使用存儲在 azure 密鑰保管庫中的敏感值(比如數據庫連接字符串)。
我了解您可以在 AAD 中注冊應用程序並使用其客戶端 ID 和客戶端密碼以編程方式生成廣告令牌,該令牌可用於調用/訪問 azure 密鑰保管庫密碼。
我的困惑是客戶端機密本身是一個敏感的“密碼”,您希望將其存儲在密鑰庫中。 一旦有人知道客戶端機密,他們就可以訪問密鑰保管庫中的所有機密。 那么創建一個新的秘密(客戶端秘密)來存儲和訪問原始秘密有什么意義呢? (有人可以解釋這背后的邏輯嗎?謝謝!
這就是自舉的問題。 你如何在不使用秘密的情況下訪問秘密商店?
如果您在 Azure 中運行您的應用程序,答案很簡單。 使用托管身份。
如果未在 Azure 中運行,則交互式應用可以代表當前用戶訪問 Key Vault。 這確實要求用戶有權訪問 Key Vault 機密。
另一種方法是使用證書而不是客戶端密碼。
如果您在 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.