从带有前缀的 Azure Key Vault 获取所有机密
Posted
技术标签:
【中文标题】从带有前缀的 Azure Key Vault 获取所有机密【英文标题】:Get All Secrets from Azure Key Vault with prefix 【发布时间】:2021-02-13 03:30:36 【问题描述】:我想知道是否可以通过前缀获取所有 Azure Key Vault Secrets。
假设我有 3 个秘密。
key: pre-secret1
value: value1
key: secret2
value: value2
key: pre-secret3
value: value3
我想获取前缀为 pre 的所有秘密并将它们序列化为 JSON。 将来,我会有更多带有前缀的秘密,所以我不想手动阅读秘密。 因此,当我添加一个带有前缀的新密钥时,我的函数也会返回一个带有新值的 JSON。
问题是:是否可以通过前缀从 Azure Key Vault 获取机密并动态序列化为 JSON?
更新:我想在 ASP.NET Core 3.1 和 C# 中使用它。 更新 2:我添加了如何获得一个秘密。
var client = new SecretClient(vaultUri: new Uri(kvUri), credential: new DefaultAzureCredential(true));
var secret = client.GetSecret("secret-name");
【问题讨论】:
我更新了我的帖子。我想在 ASP.NET Core 3.1 和 C# 中使用它。 在查询secret的时候能不能不给名字加通配符?请显示您当前拥有的代码,以便我们提供帮助。 @RufusL 我添加了如何获得一个秘密。没有办法得到秘密。 你可以试试这样的:***.com/questions/53499397/… 你需要得到所有的秘密await client.GetSecretsAsync(VaultUrl)
,过滤然后序列化。在我看来,您正在滥用 Key Vault 来实现它从未被设计为适应的用例。
【参考方案1】:
您可以使用下面的代码来实现这一点。 GetSecretsAsync
方法为您提供了一个包含保险库中所有密钥和秘密的字典。
public async Task<IDictionary<string, string>> GetSecretsAsync(string vaultBaseUrl, string prefix = null, string keyVaultKeyDelimeter = "--", string configurationKeyDelimeter = ":")
// validation
BaseUrlValidation(vaultBaseUrl);
// variable declartion
IDictionary<string, string> secretCollection = new Dictionary<string, string>();
var updatedPrefix = string.IsNullOrWhiteSpace(prefix) ? prefix : $"prefixkeyVaultKeyDelimeter";
List<SecretItem> secretIdentifierCollection = new List<SecretItem>();
// reading and adding secrets
var secrets = await this.keyVaultClient.GetSecretsAsync(vaultBaseUrl).ConfigureAwait(false);
string nextPageLink = secrets.NextPageLink;
secretIdentifierCollection.AddRange(secrets);
while (!string.IsNullOrWhiteSpace(nextPageLink))
// reading and adding secrets
var nextSecrets = await this.keyVaultClient.GetSecretsNextAsync(nextPageLink).ConfigureAwait(false);
secretIdentifierCollection.AddRange(nextSecrets);
nextPageLink = nextSecrets.NextPageLink;
if (!secretIdentifierCollection.Any())
return secretCollection;
// add filtered secrets to dictionary and remove prefix if any
foreach (var secretId in FilterPrefixMatchingSecrets(updatedPrefix, secretIdentifierCollection))
await this.FetchSecretDetailsAsync(updatedPrefix, keyVaultKeyDelimeter, configurationKeyDelimeter, secretCollection, secretId);
return secretCollection;
private async Task FetchSecretDetailsAsync(string prefix, string keyVaultKeyDelimeter, string configurationKeyDelimeter, IDictionary<string, string> secretCollection, string secretId)
var secretDetails = await this.keyVaultClient.GetSecretAsync(secretId).ConfigureAwait(false);
var secretName = secretDetails.SecretIdentifier.Name.Substring(string.IsNullOrWhiteSpace(prefix) ? 0 : prefix.Length).Replace(keyVaultKeyDelimeter, configurationKeyDelimeter);
if (!secretCollection.ContainsKey(secretName))
secretCollection.Add(secretName, secretDetails.Value);
【讨论】:
我们还需要.ConfigureAwait(false)
使用 .NET Core 吗?
是的,最好总是这样做。以上是关于从带有前缀的 Azure Key Vault 获取所有机密的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure Key Vault 进行 Terraform 以获取机密值
从 Azure Functions 访问 Azure Key Vault 时访问被拒绝
如何从 Key Vault 自动映射 Azure Functions 机密