如何解决使用前缀从Azure Key Vault获取所有秘密
我想知道是否可以通过前缀获取所有Azure Key Vault机密。
假设我有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#中使用它。 Update2:我添加了如何获得一个秘密。
var client = new SecretClient(vaultUri: new Uri(kvUri),credential: new DefaultAzureCredential(true));
var secret = client.GetSecret("secret-name");
解决方法
您可以使用以下代码实现此目的。 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 : $"{prefix}{keyVaultKeyDelimeter}";
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);
}
}
让我知道这是否对您有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。