我正在尝试从Azure Key Vault检索机密(不使用凭据,例如本教程:example):
public static async Task<string> GetSecret(string secretName)
{
try
{
return (await GetClient().GetSecretAsync(keyVaultUrl, secretName)).Value;
}
catch (KeyVaultErrorException)
{
return null;
}
catch (Exception ex)
{
return null;
}
}
public static async Task<string> GetAccessTokenAsync()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
return await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
}
private static KeyVaultClient GetClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
using KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
return keyVaultClient;
}
但是当我致电GetSecret()
时,我会得到
对象引用未设置为对象的实例
例外。
我很确定密钥库中确实存在秘密。
我的密钥库URL的格式类似于“ https://my-keyvault.vault.azure.net”。
答案 0 :(得分:1)
我在自己的网站中进行了测试,您提供的代码几乎正确。确保已在创建密钥库的Visual Studio中登录帐户。
然后删除代码中的using
,然后安装nuget。
private static KeyVaultClient GetClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
return keyVaultClient;
}
答案 1 :(得分:1)
由于GetClient
函数中有一个using语句,因此该函数返回后,将立即处置KeyVaultClient。
删除那里的使用并将其移动到您使用客户端的位置。
private static KeyVaultClient GetClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
return keyVaultClient;
}
public static async Task<string> GetSecret(string secretName)
{
try
{
using var client = GetClient();
return (await client.GetSecretAsync(keyVaultUrl, secretName)).Value;
}
catch (KeyVaultErrorException)
{
return null;
}
catch (Exception ex)
{
return null;
}
}