C# 无法从 Azure Key Vault 检索机密
C# Can't retrieve secret from Azure Key Vault
我正在尝试从 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()
时,我得到一个
object reference not set to an instance of an object
异常。
我很确定这个秘密确实存在于密钥库中。
我的密钥保管库 url 的格式类似于“https://my-keyvault.vault.azure.net”。
我在我的网站上测试,你提供的代码几乎是正确的。确保您已在创建密钥保管库的 Visual Studio 中登录您的帐户。
并删除代码中的 using
并安装 nuget。
private static KeyVaultClient GetClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
return keyVaultClient;
}
因为您的 GetClient
函数中有一个 using 语句,KeyVaultClient 在函数 returns 后立即被释放。
删除那里的使用并将其移动到您使用客户端的地方。
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;
}
}
我正在尝试从 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()
时,我得到一个
object reference not set to an instance of an object
异常。
我很确定这个秘密确实存在于密钥库中。
我的密钥保管库 url 的格式类似于“https://my-keyvault.vault.azure.net”。
我在我的网站上测试,你提供的代码几乎是正确的。确保您已在创建密钥保管库的 Visual Studio 中登录您的帐户。
并删除代码中的 using
并安装 nuget。
private static KeyVaultClient GetClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
return keyVaultClient;
}
因为您的 GetClient
函数中有一个 using 语句,KeyVaultClient 在函数 returns 后立即被释放。
删除那里的使用并将其移动到您使用客户端的地方。
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;
}
}