如何检查 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");
我团队中的每个开发人员都有自己的个人 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");