如何在一次调用中获取所有机密 Azure Key Vault

Gin*_*rma 5 .net c# azure azure-keyvault

我在这里使用示例代码解释

https://github.com/Azure-Samples/app-service-msi-keyvault-dotnet

但他们只解释了我们如何获得单个分泌物而不是分泌物列表。

所以为了得到所有的秘密,我正在使用这个代码示例

var all = kv.GetSecretsAsync(url).GetAwaiter().GetResult();
foreach (var secret in all)
{
    secretlist.Add(secret.Id);
}
Run Code Online (Sandbox Code Playgroud)

但它只获取秘密 ID,而不是价值。我也想获得所有秘密的价值,所以任何人都可以帮助我如何做到这一点?

小智 12

我们可以这样找到所有的键

var secretClient = new SecretClient(new Uri($"https://{AzureKeyVaultName}.vault.azure.net/"), new DefaultAzureCredential());
var v = secretClient.GetPropertiesOfSecrets().AsPages().ToList();
Run Code Online (Sandbox Code Playgroud)


ric*_*sch 8

查看文档,KeyVaultClient该类不包含获取所有机密(包括其值)的方法。该GetSecrets方法“列表秘密指定的键保管库。” 并返回一个SecretItem包含类型为 的项目的列表,该列表不包含值但仅包含秘密元数据。

这与 Key Vault REST API 一致,其中有一个GetSecrets返回......你猜对了......一个 SecretItems 列表。

长话短说:如果你想要所有秘密的所有值,你必须迭代列表并明确获取每个值。

  • 您是否尝试过同时进行秘密通话?Parallel.ForEach 方法。 (2认同)

byt*_*dev 7

如果您使用的是较新的Azure.Security.KeyVault.Secrets包,那么您可以使用该方法获取所有秘密GetPropertiesOfSecretsAsync,然后迭代每个结果调用GetSecretAsync. 显然这仍然是SELECT N+1但目前似乎仍然没有其他方法可以做到这一点。

请注意,您需要使用 C# 8.0 才能使用此示例:

private SecretClient _client;

// ... setup your client, for example:

_client = new SecretClient("https://mykeyvault.vault.azure.net/", new DefaultAzureCredential());
        
// ...
        
public async Task<IList<KeyVaultSecret>> GetAllAsync(CancellationToken cancellationToken = default)
{
    AsyncPageable<SecretProperties> secretProperties = _client.GetPropertiesOfSecretsAsync(cancellationToken);

    var secrets = new List<KeyVaultSecret>();

    await foreach (var secretProperty in secretProperties)
    {
        var response = await _client.GetSecretAsync(secretProperty.Name, cancellationToken: cancellationToken).ConfigureAwait(false);
        
        secrets.Add(response.Value);
    }

    return secrets;
}
Run Code Online (Sandbox Code Playgroud)