Как получить токен доступа Azure с помощью DefaultAzureCredential без сохранения секретов

Я пытаюсь настроить свою среду, чтобы иметь доступ к ресурсам Azure из-за пределов Azure.

При просмотре различных вариантов я наткнулся в основном на варианты ниже многих других.

Вариант 1. Создание субъекта-службы с помощью Azure CLI и использование секретов клиента для извлечения токена и доступа к ресурсам . Получение секретов клиента во время выполнения.

Вариант 2. Использование DefaultAzureCredential (Azure.Identity) для извлечения токена и доступа к ресурсам DefaultAzureCredential

В настоящее время я пробую вариант DefaultAzureCredential, чтобы иметь доступ к ресурсам Azure, таким как ADF, хранилище BLOB-объектов и т. д.

Я могу сделать это, используя учетные данные Visual Studio (VS 2019). Однако остается проблема выполнения того же действия через конвейер, работающий за пределами Azure. Я не хочу сохранять какие-либо секреты в коде. Означает ли это, что я не могу использовать переменные среды для Цели?

Если это действительно возможно, тогда нужна помощь с кодом.

Окружающая среда : . Сетевая структура 4.8/ядро 3.1

Желаемый поток:

Используйте учетные данные Visual Studio для локальной разработки и тестирования.

Используйте переменные среды ИЛИ другие задачи, поддерживаемые DefaultAzureCredential через задачу DevOps Pipeline.

Код:

      var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
    new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);

1 ответ

Я смог решить эту проблему с помощью DefaultAzureCredential. Мы следовали приведенному ниже подходу, чтобы решить эту проблему.

  1. Добавлен код для чтения секретов из appsetting.json.
  2. Добавить секреты к переменным среды
  3. Используйте DefaultAzureCredential*, чтобы исправить переопределение.
  4. Добавьте задачу замены токена в конвейеры сборки/выпуска, чтобы заменить секретные переменные клиента секретами из параметров конвейера.
  5. Код при выполнении из Visual Studio не находит фактического значения секретных переменных из appsetting.json, а затем использует учетные данные VisualStudio.

Чтение значений

          string AZURE_CLIENT_SECRET = ConfigurationHelper.GetByName("AZURE_CLIENT_SECRET");
    string AZURE_CLIENT_ID = ConfigurationHelper.GetByName("AZURE_CLIENT_ID");
    string AZURE_TENANT_ID = ConfigurationHelper.GetByName("AZURE_TENANT_ID");

        // Check whether the environment variable exists.

        if (AZURE_CLIENT_SECRET != "{{AZURE_CLIENT_SECRET}}"
            && AZURE_CLIENT_ID != "{{AZURE_CLIENT_ID}}" &&
            AZURE_TENANT_ID != "{{AZURE_TENANT_ID}}")
        {
            Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", AZURE_CLIENT_SECRET);
            Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", AZURE_CLIENT_ID);
            Environment.SetEnvironmentVariable("AZURE_TENANT_ID", AZURE_TENANT_ID);

            Console.WriteLine("Setting Environment Variables");
        }

Вызов DefaultAzureCredential

      var objDefaultAzureCredentialOptions = new DefaultAzureCredentialOptions
                {
                    ExcludeEnvironmentCredential = false,
                    ExcludeManagedIdentityCredential = true,
                    ExcludeSharedTokenCacheCredential = true,
                    ExcludeVisualStudioCredential = false,
                    ExcludeVisualStudioCodeCredential = false,
                    ExcludeAzureCliCredential = true,
                    ExcludeInteractiveBrowserCredential = true
                };

 var tokenCredential = new DefaultAzureCredential(objDefaultAzureCredentialOptions);

ValueTask<AccessToken> accessToken = tokenCredential.GetTokenAsync(
                        new TokenRequestContext(scopes: new[] { "https://management.azure.com/.default" }));
  • Если переменные среды присутствуют в активном сеансе, код использует переменные среды.
Другие вопросы по тегам