Не удается подключиться к Azure Key Vault на Linux - PullRequest
1 голос
/ 06 мая 2020

Неделя a go Решил сделать переключение, сделал Windows своей вторичной ОС, а Linux - основной. Мне нравится Linux, но у меня возникла проблема. Я начал изучать ASP. NET Core где-то полгода go. Я создал небольшое приложение для форума с Visual Studio на ASP NET Core 3.1. Также используется хранилище ключей azure. Он отлично работал под Windows, но под Linux он не работает должным образом.

Краткое изложение проблемы, с которой я столкнулся:

Когда я пытаюсь подключиться к Azure хранилище ключей под Windows работает из-за VS, но под Linux - нет. Выдает исключение, что не может получить токен. Мне известно, что под Linux он использует Azure CLI (у меня он установлен, и я вошел в систему). Также работает команда оболочки для получения токена хранилища. Но когда я запускаю свой код с do tnet run, он просто не работает. Для IDE я использую Rider, но это не важно.

Получаю ошибку:

Unhandled exception. Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: RunAs=App;, Resource: https://vault.azure.net, Authority: https://login.windows.net/4a06d40c-e447-42be-baef-dd0421ed10bd. Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAuthResultAsyncImpl(String resource, String authority, CancellationToken cancellationToken)
at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.<get_KeyVaultTokenCallback>b__8_0(String authority, String resource, String scope)
at Microsoft.Azure.KeyVault.KeyVaultCredential.PostAuthenticate(HttpResponseMessage response)
at Microsoft.Azure.KeyVault.KeyVaultCredential.ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at ForumSystem.Web.Program.Main(String[] args) in /home/bruteforce/RiderProjects/ForumSystem-Web/src/Web/ForumSystem.Web/Program.cs:line 16

Process finished with exit code 6.

Мой код:

namespace ForumSystem.Web
{
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Azure.KeyVault;
    using Microsoft.Azure.Services.AppAuthentication;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureKeyVault;
    using Microsoft.Extensions.Hosting;

    public static class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(
                (ctx, builder) =>
            {
                var keyVaultEndpoint = GetKeyVaultEndpoint();
                if (!string.IsNullOrEmpty(keyVaultEndpoint))
                {
                    var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App;");
                    var keyVaultClient = new KeyVaultClient(
                        new KeyVaultClient.AuthenticationCallback(
                            azureServiceTokenProvider.KeyVaultTokenCallback));
                    builder.AddAzureKeyVault(
                    keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                }
            })
                .ConfigureWebHostDefaults(
                    webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });

        private static string GetKeyVaultEndpoint() => "https://myKeyVault.vault.azure.net/";
    }
}

Код, который я использую, скопирован из документов, и я добавил строку подключения RunAs = App.

Что я пробовал:

Я заверил, что Azure CLI установлен, вошел в учетную запись и что я использую последнюю стабильную версию CLI и. NET Core 3.1. Пробовал переустановить Linux. Также я попытался запустить код со строкой подключения и без нее в AzureServiceTokenPorvider. Я просто получаю аналогичную ошибку, в которой мне сказали, что он пробовал 3 разных способа, а на третьем (Azure CLI) просто говорится, что токен не может быть получен. Конечно, я также пытался переустановить. NET Core и Azure CLI несколько раз, но безуспешно.

Я буду рад предоставить любую дополнительную информацию, если потребуется:)

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