如何检查 secret 是否在 Azure Key Vault 中

How to check if secret is in Azure Key Vault

我团队中的每个开发人员都有自己的个人 Azure 密钥 保险库链接到他们的本地计算机。我们有一个生产站点查看的生产 Azure 密钥保管库。

在代码中,它从保险库中查找特定的秘密。开发人员不会在他们的个人密钥保管库中拥有秘密,但生产密钥保管库将拥有秘密。

因此,当开发人员在调试时,它会捕获一个异常,指出秘密不存在。

有没有办法有条件地检查是否存在秘密,或者我是否只需要让它捕获异常?

无法检查密钥保管库中是否存在机密。因此,可以利用一些创造力来做到这一点(为简洁起见,跳过参数检查):

    public bool CheckIfSecretExists(string accessToken, string secretUri)
    {
        var kvClient= new KeyVaultClient(accessToken);
        try
        {
            kvClient.GetSecretAsync(secretUri ).Result.Value;
            return true;
        }
        catch (AggregateException ex)
        {
            if (ex.InnerException is KeyVaultErrorException exception && exception.Body.Error.Code == "SecretNotFound")
                return false;

            throw;
        }
    }

编辑: 找到了一种不依赖异常来检查秘密是否存在的方法:

public async Task<bool> DoesSecretExist(string accessToken, string keyVaultBaseUrl, string secretName)
{
    var kvClient = new KeyVaultClient(accessToken);
    try
    {
        IPage<SecretItem> secretVersions = await kvClient.GetSecretVersionsAsync(keyVaultBaseUrl, secretName)
                                             .ConfigureAwait(false);
        if (!secretVersions.Any())
            return false;

        return true;
    }
    catch (Exception )
    {
        throw;
    }
}

检查异常中是否未发现错误的更简单方法是来自 HTTPRequest 响应

 try
 {
    var secret = await this.keyVaultClient.GetSecretAsync(keyVaultUri, secretName, cancellationToken).ConfigureAwait(false);
 }             
 catch (KeyVaultErrorException ex)
 {
    if (ex.Response.StatusCode != HttpStatusCode.NotFound)
    {
    // Handle the error
    }

 }

使用先前设置的环境变量(包括AZURE_CLIENT_ID、AZURE_CLIENT_SECRET和AZURE_TENANT_ID.[=12=)使用来自Azure.Identity的默认凭据创建新的秘密客户端]

var client = new SecretClient(vaultUri: new Uri(keyVaultUrl), credential: new DefaultAzureCredential());

使用机密客户端检索机密。

secret = client.GetSecret("secret-name");