ASP.NET Core 3: не останавливать запуск приложения, если не удается получить доступ к хранилищу ключей - PullRequest
1 голос
/ 13 октября 2019

У меня есть приложение ASP.NET Core 3, в котором используется хранилище ключей Azure. Он отлично работает на производстве, а также отлично отлаживается в vs2019, если я вошел в свою учетную запись Microsoft в Visual Studio. Но когда я не вошел в VS, он дает сбой и препятствует запуску приложения, а не продолжает запуск приложения. Я хотел бы, чтобы это работало, когда разработчик не вошел в VS (как другие разработчики работают таким образом). Вот соответствующий код запуска:

public static IHostBuilder CreateHostBuilder(string[] args)
    {
        {
            static string GetKeyVaultEndpoint() => "https://[myappvalut].vault.azure.net";

            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(
                new KeyVaultClient.AuthenticationCallback(
                    azureServiceTokenProvider.KeyVaultTokenCallback));
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureHostConfiguration(c => c.AddAzureKeyVault(GetKeyVaultEndpoint(), keyVaultClient, new DefaultKeyVaultSecretManager()));
        }
    }

и вот исключение, которое я получаю при запуске:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: 'Параметры: Строка подключения: [Строка подключения не указана], ресурс: https://vault.azure.net, Полномочия: https://login.windows.net/[guid]. Сообщение об исключении: Попробовал следующие 3 метода для получения токена доступа, но ни один из них не сработал.

Есть ли какой-нибудь изящный способ восстановиться после этого и продолжить запуск приложения, или добавить Key Vault, только если я знаю, что у меня есть строка подключения?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

В моей статье есть пример, который можно адаптировать: https://joonasw.net/view/aspnet-core-azure-keyvault-msi.

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

Обратите внимание, что образец был сделан для ASP.NET Core 2.1:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((ctx, builder) =>
        {
            //Build the config from sources we have
            var config = builder.Build();
            var keyvaultUrl = config["KeyVault:BaseUrl"];
            if (!string.IsNullOrEmpty(keyVaultUrl))
            {
                //Add Key Vault to configuration pipeline
                builder.AddAzureKeyVault(keyvaultUrl);
            } 
        })
        .Build();
0 голосов
/ 14 октября 2019

Вы можете использовать субъект обслуживания для доступа к вашему хранилищу ключей. Здесь - это документ.

string clientId = Environment.GetEnvironmentVariable("akvClientId");
string clientSecret = Environment.GetEnvironmentVariable("akvClientSecret");

KeyVaultClient kvClient = new KeyVaultClient(async (authority, resource, scope) =>
{
    var adCredential = new ClientCredential(clientId, clientSecret);
    var authenticationContext = new AuthenticationContext(authority, null);
    return (await authenticationContext.AcquireTokenAsync(resource, adCredential)).AccessToken;
});
...