use*_*624 2 c# azure azure-keyvault
我有以下代码行从 KeyVault 返回秘密
string kvSecret = kVClient.GetSecretAsync(azureKeyVaultUrl, secret).Result.Value;
Run Code Online (Sandbox Code Playgroud)
虽然这按预期工作,但我不太清楚Result.Value同步执行如何处理运行时错误、异常等。
我试图了解当我调用 Result.Value 时是否有可能出现错误,并且返回的值实际上不是秘密,而是一些随机错误,因此我的变量kvSecret不包含正确的值,而是包含其他值。
我问这个问题的原因是我想确保如果变量不为空或空,它将始终包含秘密而不是其他随机字符串。
不幸的是,KeyVault 客户端设计为在机密不存在的情况下返回带有 KeyVaultErrorException 的任务,而不是失败消息\结果。
在您的情况下,它会爆炸,因为当您调用.Result它时,它会解开任务中的异常,并会中断执行流程。
在 KeyVault 中检索机密的最佳方法是将逻辑包装在 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
}
Run Code Online (Sandbox Code Playgroud)
为了更轻松地使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
。
上面的截图来自我的头脑,而不是生产代码的副本
如果您使用如上所述的逻辑,而不是抛出未找到秘密的异常,而是进行适当的异常处理并返回空值或表示未找到秘密的值,那么您将能够像预期的那样解开结果。