Хранилище ключей Azure: получение / удаление / установка операций с KeyVaultClient в .NET Core 2.2 - PullRequest
0 голосов
/ 05 мая 2019

Я видел много примеров хранилища ключей Azure, используемых для получения секретов с использованием IConfiguration, включая this и this , однако они в основном касаются просмотра секретов, а не операций типа CRUD.

Я пытаюсь использовать методы расширения IKeyVaultClient, такие как GetSecretAsync, описать здесь .Чтобы реализовать это, я использую удостоверение управляемой службы в Azure и выполнил следующие шаги (за пределами типовой конфигурации Azure):

  1. Создание общедоступного IKeyVaultOps интерфейса и KeyVaultOps реализации общедоступного классасодержащий создание KeyVaultClient.

KeyVaultOps.cs

public class KeyVaultOps : IKeyVaultOps
{
    public KeyVaultClient GetKeyVaultClient()
    {
        AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
        return new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    }
}
Используйте DI для инъекции, где это необходимо:

Startup.cs

services.AddSingleton<IKeyVaultOps, KeyVaultOps>();

Страница бритвы:

private readonly IKeyVaultOps keyVaultOps;
private readonly IConfiguration configuration;

public TestPageModel(
    IKeyVaultOps keyVaultOps,
    IConfiguration configuration
)
{
    this.keyVaultOps = keyVaultOps;
    this.configuration = configuration;
}

public string Secret { get; set; }

public class TestPageModel : PageModel
{
    public async Task OnGetAsync()
    {
        try
        {
            var vaultUrl = configuration["KeyVaultUrl"];
            SecretBundle secretBundle = await keyVaultOps.GetKeyVaultClient().GetSecretAsync(vaultUrl, "TestSecret");
            Secret = secretBundle.Value;
        }
        catch (Exception ex)
        {
            Secret = ex.Message;
        }
    }
}

Распознавание Мне на самом деле не нужноинтерфейс для правильной работы, я ищу предложения по двум вещам:

  1. Есть ли лучший способ настроить свойство URL KeyVaultClient, чем внедрение IConfiguration на каждомкласс, мне нужна реализация?

  2. Так как мой основной проект в любом случае имеет using операторов для Microsoft.Azure.KeyVault, есть ли способ избежать моей собственной реализации GetKeyVaultClient() и просто использовать:

    services.AddSingleton<IKeyVaultClient, KeyVaultClient>();

... вместе с необходимыми методами расширения?

ПРИМЕЧАНИЕ. Приведенная выше строка в Startup.cs дает:

Ни один конструктор для типа 'Microsoft.Azure.KeyVault.KeyVaultClient' не может быть создан с использованием служб из контейнера служб и значений по умолчанию

1 Ответ

0 голосов
/ 05 мая 2019

Мне нравится создавать свой собственный сервис для доступа к хранилищу ключей, который обрабатывает URL-адрес и выполняет аутентификацию для меня, поэтому мой код может просто использовать сервис без учета конфигурации.Это работает примерно так:

public interface IMyKeyVaultClient {
   Task<SecretBundle> GetSecretAsync(string secretName);
}

public class MyKeyVaultClient : IMyKeyVaultClient {
   public MyKeyVaultClient(IConfiguration config, IWhateverElseYouNeedForGettingCredentials otherStuff) {
       //snag the URL from config and credentials from otherStuff
       //instantiate keyVaultClient;
   }
   private KeyVaultClient keyVaultClient;
   private string url;
   public Task<SecretBundle> GetSecretAsync(string secretName) {
       return keyVaultClient.GetSecretAsync(url, secretName);
   }
}

, затем зарегистрируйте свой сервис,

services.AddSingleton<IMyKeyVaultClient, MyKeyVaultClient>();

, тогда ваш код вызова может просто запросить IMyKeyVaultClient из DI и позвонить GetSecretAsync() с помощью всего лишьсекретное имя и не нужно беспокоиться о деталях.

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