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