C#无法从Azure Key Vault检索机密

时间:2019-12-05 09:21:10

标签: c# azure azure-keyvault

我正在尝试从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”。

2 个答案:

答案 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;
   }
}