代码之家  ›  专栏  ›  技术社区  ›  user3587624

Azure KeyVault GetSecretAsync.Result.Value错误处理

  •  0
  • user3587624  · 技术社区  · 6 年前

    我有下面一行代码来返回钥匙库中的一个秘密

    string kvSecret = kVClient.GetSecretAsync(azureKeyVaultUrl, secret).Result.Value;
    

    虽然这是预期的工作,但我不太清楚 结果.值 同步执行处理运行时错误、异常等。

    我试图理解调用Result.Value时是否有任何可能,其中有一个错误,返回的值实际上不是秘密,而是一些随机错误,因此是我的变量 不包含正确的值,但包含其他值。

    我这样问的原因是,我想确保如果变量不是null或空的,它将始终包含秘密,而不是其他随机字符串。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Diego Mendes    6 年前

    不幸的是,keyvaultclient被设计为在机密不存在的情况下返回带有KeyVaultErrorException的任务,而不是返回失败消息\结果。

    在你的情况下,它爆炸了,因为当你打电话 .Result 它将在任务中打开异常并中断执行流。

    在KeyVault中检索secret的最佳方法是将逻辑包装在Try\Catch块中,如下所示:

    try
    {
        var secret = await client.GetSecretAsync(secretPath);
        //... any other logic here ...
    }
    catch (KeyVaultErrorException kvex)
    {
        //handle key not found here
    }
    catch (HttpRequestException ex)
    {
        //handle any other error here if needed
    }
    

    为了更容易使用keyvault,我通常创建一个类来处理这些逻辑,例如:

    public class SecretManager
    {
        KeyVaultClient client;
        public SecretManager(KeyVaultClient client){ this.client = client; }
    
        public Task<string> GetSecretAsync(string secretName){
            //here I wrap the logic mentioned above
        }
    }
    

    .

    不是生产代码的副本