Как получить все секреты в одном вызове хранилище ключей Azure - PullRequest
0 голосов
/ 27 ноября 2018

Я использую пример кода, объясните здесь

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);
}

, но он получает только секретный идентификатор, а не значение.Я хочу, чтобы все секреты тоже ценились, поэтому кто-нибудь может мне помочь, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Вы должны получить все секреты, возвращая IPage SecretItem, а затем перебрать каждый из них, чтобы получить SecretBundle, подобный этому.Вот мой код, который обрабатывает операцию:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.KeyVault;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;

namespace TradingReplay.Engine
{
    public class SecurityCredentials : Serialisable<SecurityCredentials, SecurityCredentials>
    {
        public string VaultUrl { get; set; }
        public string ApplicationId {get; set;}
        private string ApplicationSecret { get; set; }
        internal Dictionary<string, string> Cache { get; set; } = new Dictionary<string, string>();

        public SecurityCredentials()
        { }

        public SecurityCredentials(string vaultUrl, string applicationId, string applicationSecret)
        {
            VaultUrl = vaultUrl;
            ApplicationId = applicationId;
            ApplicationSecret = applicationSecret;
        }

        public async Task<SecurityCredentials> InitialiseAzure()
        {
            var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync), new HttpClient());
            var secrets = await client.GetSecretsAsync(VaultUrl);

            foreach (var item in secrets)
                Cache.Add(item.Identifier.Name, await GetSecretAsync(client, item.Identifier.Name));

            return this;
        }

        public async Task<string> GetSecretAsync(string key)
        {
            if (Cache.TryGetValue(key, out var value))
                return value;
            else
            {
                var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync), new HttpClient());
                var secret = await GetSecretAsync(client, key);
                Cache.Add(key, secret);
                return secret;
            }
        }

        public async Task<string> GetSecretAsync(KeyVaultClient client, string key)
        {
            var secret = await client.GetSecretAsync(VaultUrl, key);
            return secret.Value;
        }

        private async Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
        {
            var appCredentials = new ClientCredential(ApplicationId, ApplicationSecret);
            var context = new AuthenticationContext(authority, TokenCache.DefaultShared);

            var result = await context.AcquireTokenAsync(resource, appCredentials);

            return result.AccessToken;
        }
    }
}

В целях тестирования я зарегистрировал приложение для доступа к моим экземплярам Azure и для инициализации класса все, что я делаю, это:

var credentials = await new SecurityCredentials("<vaultUrl>", "<applicationId>", "<applicationSecret>").InitialiseAzure();

а затем можете позвонить:

credentials["<secretName>"];
0 голосов
/ 27 ноября 2018

Глядя на документацию, KeyVaultClient Класс не содержит метода для получения всех секретов, включая их значения.Метод GetSecrets «Список секретов в указанном хранилище ключей».и возвращает список с элементами типа SecretItem, который не содержит значения, а содержит только секретные метаданные.

Это соответствует API REST Key Vault, где есть GetSecrets , который возвращает ... вы уже догадались ... список SecretItems.

Короче говоря: если вы хотите, чтобы все значения всех секретов, вы должны повторить список иполучить каждый явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...