Поделиться через


Проверка подлинности приложений C++ в службах Azure во время локальной разработки с помощью учетных записей разработчиков

Во время локальной разработки приложения должны пройти проверку подлинности в Azure для использования различных служб Azure. Проверка подлинности локально с помощью одного из следующих подходов:

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

  • Использование групп Microsoft Entra для эффективного управления разрешениями для нескольких учетных записей разработчиков.
  • Назначение ролей учетным записям разработчиков для определения области действия разрешений.
  • Как войти в поддерживаемые локальные средства разработки.
  • Как пройти проверку подлинности с помощью учетной записи разработчика из кода приложения.

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

Чтобы приложение проходило аутентификацию в Azure во время локальной разработки с использованием учетных данных разработчика в Azure, разработчик должен быть авторизован в Azure через Azure CLI.

Библиотека идентификации Azure может обнаружить, что разработчик вошел в систему через инструмент. Затем библиотека может получить токен доступа Microsoft Entra с помощью инструмента для аутентификации приложения в Azure от имени авторизованного пользователя.

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

Создание группы Microsoft Entra для локальной разработки

Создайте группу Microsoft Entra, чтобы объединять роли (разрешения), необходимые приложению при локальной разработке, а не назначать роли отдельным объектам службы-принципала. Этот подход обеспечивает следующие преимущества:

  • Каждый разработчик имеет одинаковые роли, назначенные на уровне группы.
  • Если для приложения требуется новая роль, ее необходимо только добавить в группу для приложения.
  • Если новый разработчик присоединяется к команде, для разработчика создается новая учетная запись службы приложений и добавляется в группу, гарантируя, что разработчик имеет необходимые разрешения на работу с приложением.
  1. Перейдите на страницу обзора идентификатора Microsoft Entra на портале Azure.

  2. Выберите все группы в меню слева.

  3. На странице Группы выберите Создать группу.

  4. На странице "Создать группу" заполните следующие поля формы:

    • Тип группы: Выберите безопасность .
    • Имя группы: введите имя группы, которая содержит ссылку на имя приложения или среды.
    • Описание группы: введите описание, объясняющее назначение группы.

    Снимок экрана: создание группы на портале Azure.

  5. Выберите ссылку "Нет участников" в разделе "Участники", чтобы добавить участников в группу.

  6. На открывшейся всплывающей панели найдите созданную ранее основную служебную учетную запись и выберите её из результатов фильтрации. Нажмите кнопку "Выбрать " в нижней части панели, чтобы подтвердить выбор.

  7. Нажмите кнопку "Создать " в нижней части страницы "Создать группу ", чтобы создать группу и вернуться на страницу "Все группы ". Если вы не видите новую группу, подождите минуту и обновите страницу.

Назначьте роли группе

Затем определите, какие роли (разрешения) приложения требуются для ресурсов и назначьте эти роли созданной группе Microsoft Entra. Группы можно назначить роль в ресурсе, группе ресурсов или области подписки. В этом примере показано, как назначать роли в области группы ресурсов, так как большинство приложений группируют все свои ресурсы Azure в одну группу ресурсов.

  1. На портале Azure перейдите на страницу обзора группы ресурсов, содержащей приложение.

  2. Выберите управление доступом (IAM) в левой панели навигации.

  3. На странице управления доступом (IAM) выберите +Добавить , а затем выберите "Добавить назначение ролей " в раскрывающемся меню. Страница "Добавление назначения ролей " предоставляет несколько вкладок для настройки и назначения ролей.

  4. На вкладке "Роль" используйте поле поиска, чтобы найти роль, которую вы хотите назначить. Выберите роль и нажмите кнопку "Далее".

  5. На вкладке "Члены" :

    • Чтобы назначить доступ к значению , выберите "Пользователь", "Группа" или "Субъект-служба ".
    • Для значения "Члены" нажмите кнопку "Выбрать участников ", чтобы открыть панель всплывающего меню "Выбор участников ".
    • Найдите созданную ранее группу Microsoft Entra и выберите ее из отфильтрованных результатов. Выберите команду "Выбрать ", чтобы выбрать группу и закрыть панель всплывающего меню.
    • Выберите Обзор + Назначение внизу вкладки Члены.

    Снимок экрана, показывающий, как назначить роль группе Microsoft Entra.

  6. На вкладке "Обзор и назначение" выберите "Обзор и назначение" в нижней части страницы.

Вход в Azure с помощью средств разработчика

Войдите в Azure с помощью одного из нескольких средств разработчика, которые можно использовать для проверки подлинности в среде разработки. Учетная запись, которую вы используете для аутентификации, также должна существовать в созданной и настроенной ранее группе Microsoft Entra.

Azure CLI (Интерфейс командной строки для Azure)

Разработчики могут использовать Azure CLI для проверки подлинности. Приложения , использующие DefaultAzureCredential или AzureCliCredential , могут использовать эту учетную запись для проверки подлинности запросов приложений.

Чтобы выполнить проверку подлинности с помощью Azure CLI, выполните az login команду. В системе с веб-браузером по умолчанию Azure CLI запускает браузер для проверки подлинности пользователя.

az login

Для систем без веб-браузера по умолчанию команда az login использует поток проверки подлинности кода устройства. Пользователь также может принудительно заставить Azure CLI использовать поток кода устройства вместо запуска браузера, указав аргумент --use-device-code.

az login --use-device-code

Авторизация в службах Azure из вашего приложения

Библиотека удостоверений Azure для C++ предоставляет различные учетные данные, адаптированные для поддержки различных сценариев и потоков проверки подлинности Microsoft Entra. На шаге выше показано, как использовать DefaultAzureCredential при работе с учетными записями пользователей локально.

Реализация кода

Класс DefaultAzureCredential — это упорядоченная последовательность механизмов проверки подлинности в идентификаторе Microsoft Entra. Каждый механизм проверки подлинности является классом, производным от TokenCredential класса и называется учетными данными. В этом сценарии последовательно проверяет, DefaultAzureCredential выполнил ли разработчик вход в Azure с помощью Azure CLI. Если разработчик вошел в Azure CLI, учетные данные, используемые для входа в средство, используются приложением для проверки подлинности в Azure. Дополнительные сведения о настройке цепочки учетных данных см. в разделе "Настройка DefaultAzureCredential".

  1. Добавьте пакет azure-identity-cpp в приложение с помощью vcpkg.

    vcpkg add port azure-identity-cpp
    
  2. Добавьте следующие строки в файл CMake:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Для любого кода C++, создающего клиентский объект Пакета SDK Azure в приложении, необходимо:

    1. azure/identity.hpp Включите заголовок.

    2. Используйте DefaultAzureCredential или AzureCliCredential, чтобы создать экземпляр учетных данных. Рассмотрим пример.

      • Чтобы использовать DefaultAzureCredential, задайте для переменной AZURE_TOKEN_CREDENTIALSdev среды значение, указывающее, что приложение работает в среде разработки. Дополнительные сведения см. в разделе "Настройка DefaultAzureCredential".

        // Environment variable AZURE_TOKEN_CREDENTIALS=dev
        auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
        
      • Или всегда используется AzureCliCredential для проверки подлинности пользователя, вошедшего в систему Azure CLI.

        auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();
        
    3. Передайте экземпляр DefaultAzureCredential или AzureCliCredential в конструктор клиента Azure SDK.

    Пример этих шагов показан в следующем сегменте кода. В этом примере создается клиент BLOB-объектов службы хранилища Azure, используя DefaultAzureCredential для проверки подлинности в Azure.

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    
    int main() {
        try {
            // DefaultAzureCredential supports dev, test, and prod environments.
            // See documentation for details on customizing the credential chain:
            // https://learn.microsoft.com/azure/developer/cpp/sdk/authentication/credential-chains#defaultazurecredential-overview
            // In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.
            // Here DefaultAzureCredential is used for local development and environment variable AZURE_TOKEN_CREDENTIALS=dev
    
            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
    
            // Or use AzureCliCredential to always use the Azure CLI signed-in user to authenticate
            // auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // TODO: perform some action with the blob client
            // auto blobClient = containerClient.GetBlobClient("sample-blob");
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }