【问题标题】:C# Can't retrieve secret from Azure Key VaultC# 无法从 Azure Key Vault 检索机密
【发布时间】:2020-03-30 04:31:50
【问题描述】:

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

【问题讨论】:

  • GetClient() 函数中有一个using。这意味着客户端在返回之前已被处理。将 using 放在使用客户端的代码中,而不是 GetClient() 函数中。
  • @juunas 哇,我很愚蠢。请随意回答问题,以便我投票。

标签: c# azure azure-keyvault


【解决方案1】:

我在我的网站上进行了测试,您提供的代码几乎是正确的。确保您已在创建密钥保管库的 Visual Studio 中登录您的帐户。

并删除代码中的using 并安装nuget

private static KeyVaultClient GetClient()
{
   AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
   KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
   return keyVaultClient;
}

【讨论】:

    【解决方案2】:

    因为您的 GetClient 函数中有一条 using 语句,所以 KeyVaultClient 会在函数返回后立即释放。 删除那里的 using 并将其移动到您使用客户端的位置。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 2016-07-04
      • 1970-01-01
      • 2020-12-19
      • 2020-08-27
      • 2020-05-07
      • 2020-04-26
      相关资源
      最近更新 更多