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


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

Приложения часто требуют безопасных подключений между несколькими службами Azure одновременно. Например, экземпляр корпоративного приложения Azure может подключаться к нескольким разным учетным записям хранения, экземпляру базы данных SQL Azure, служебной шине и т. д.

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

Сравните типы управляемых удостоверений

Azure предоставляет следующие типы управляемых удостоверений:

  • Назначаемые системой удостоверения напрямую связаны с одним ресурсом Azure. При включении в службе управляемого удостоверения, назначаемого системой, Azure создаст связанное удостоверение и выполнит обработку административных задач для этого удостоверения внутри. При удалении ресурса Azure удостоверение также удаляется.
  • Управляемые удостоверения, назначаемые пользователем, являются независимыми удостоверениями, созданными администратором, и могут быть связаны с одним или несколькими ресурсами Azure. Жизненный цикл удостоверения не зависит от этих ресурсов.

Вы можете узнать больше о лучших практиках и о том, когда использовать управляемые удостоверения, назначаемые системой, а когда — назначаемые пользователем, в рекомендациях по лучшим практикам использования управляемых удостоверений.

Обзор «DefaultAzureCredential»

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

Подключение размещенного в Azure приложения к нескольким службам Azure

Представьте, что вам нужно подключить существующее приложение к нескольким службам и базам данных Azure с помощью бессерверных подключений. При этом приложение представляет собой веб-API ASP.NET Core, размещенное в службе приложений Azure, хотя приведенные ниже действия применимы и к другим средам размещения Azure, таким как Azure Spring Apps, виртуальные машины, контейнерные приложения и AKS.

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

Схема, показывающая отношения идентификации, назначенные пользователем.

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

Создать системно назначенное управляемое удостоверение

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

  2. На странице обзора службы выберите Идентификация.

  3. Переключите настройку Состояние в положение Вкл, чтобы включить управляемое удостоверение, назначаемое системой, для службы.

    Снимок экрана: назначение управляемого удостоверения, назначаемого системой.

Назначайте роли управляемому удостоверению для каждой из подключенных служб

  1. Перейдите на страницу обзора аккаунта хранения, к которому вы хотите предоставить доступ вашим идентификационным данным.

  2. Выберите Контроль доступа (IAM) в навигации учетной записи хранения.

  3. Нажмите + Добавить, а затем — Добавить назначение ролей.

    Снимок экрана, показывающий, как найти раздел портала Azure для назначения роли управляемому удостоверению, управляемой системой.

  4. В окне поиска Роль найдите Storage Blob Data Contributor, который предоставляет разрешения на выполнение операций чтения и записи с данными BLOB-объектов. Вы можете назначить любую роль, подходящую для вашего варианта использования. Выберите значение Участник данных BLOB-объектов хранилища в списке и нажмите кнопку Далее.

  5. На экране Добавление назначения ролей для параметра Назначение доступа для выберите Управляемое удостоверение. Затем нажмите + Выбрать членов.

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

    Снимок экрана, показывающий, как назначить роль управляемому удостоверению, назначенному системой, в портале Azure.

  7. Нажмите кнопку Далее несколько раз, пока не сможете нажать кнопку Проверить и назначить, чтобы завершить назначение роли.

  8. Повторите этот процесс для других служб, к которым вы хотите подключиться.

Рекомендации к локальной разработке

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

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

  2. Найдите учетную запись user@domain или группу безопасности Microsoft Entra, к которым вы хотите предоставить доступ по адресу электронной почты или имени, а затем выберите ее. Это должна быть та же учетная запись, используемая для входа в локальные инструменты разработки, например Visual Studio или Azure CLI.

Примечание.

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

Реализация кода приложения

  1. В проекте установите Azure.Identity пакет. Эта библиотека предоставляет DefaultAzureCredential. Вы также можете добавить другие библиотеки Azure, относящиеся к вашему приложению. В этом примере добавлены пакеты Azure.Storage.Blobs и Azure.Messaging.ServiceBus для подключения к хранилищу BLOB-объектов и служебной шине соответственно.

    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. Создайте экземпляры клиентов службы для служб Azure, к которым должно подключаться ваше приложение. Следующий пример кода взаимодействует с хранилищем BLOB-объектов и Шиной обслуживания, используя соответствующих клиентов служб.

    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    using Azure.Storage.Blobs;
    
    // Create DefaultAzureCredential instance that uses system-assigned managed identity
    // in the underlying ManagedIdentityCredential.
    DefaultAzureCredential credential = new();
    
    BlobServiceClient blobServiceClient = new(
        new Uri("https://<your-storage-account>.blob.core.windows.net"),
        credential);
    
    ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
    ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
    

При локальном DefaultAzureCredential запуске этого кода выполняется поиск в цепочке учетных данных для первых доступных учетных данных. Managed_Identity_Client_ID Если переменная среды имеет значение NULL локально, используется учетные данные, соответствующие локально установленному средству разработчика. Например, Azure CLI или Visual Studio. Дополнительные сведения об этом процессе см. в разделе " Изучение DefaultAzureCredential".

При развертывании приложения в Azure DefaultAzureCredential автоматически извлекает Managed_Identity_Client_ID переменную из среды Служба приложений. Это значение становится доступным, когда управляемое удостоверение связано с вашим приложением.

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

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

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

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

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

  • Два подключения к отдельным учетным записям хранения с помощью назначенной пользователем управляемой идентичности
  • Подключение к Azure Cosmos DB и службам SQL Azure с помощью второго управляемого удостоверения, назначаемого пользователем. Это управляемое удостоверение используется, когда драйвер клиента SQL Azure разрешает его. Дополнительные сведения см. в комментариях кода.
  1. В проекте установите необходимые пакеты. Библиотека удостоверений Azure предоставляет DefaultAzureCredential.

    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. Добавьте следующий код:

    using Azure.Core;
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Data.SqlClient;
    
    string clientIdStorage =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialStorage = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdStorage,
        });
    
    // First Blob Storage client
    BlobServiceClient blobServiceClient1 = new(
        new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    // Second Blob Storage client
    BlobServiceClient blobServiceClient2 = new(
        new Uri("https://<contract-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    string clientIdDatabases =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialDatabases = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdDatabases,
        });
    
    // Create an Azure Cosmos DB client
    CosmosClient cosmosClient = new(
        Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
        credentialDatabases);
    
    // Open a connection to Azure SQL
    string connectionString =
        $"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
    
    using (SqlConnection connection = new(connectionString)
    {
        AccessTokenCallback = async (authParams, cancellationToken) =>
        {
            const string defaultScopeSuffix = "/.default";
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";
            AccessToken token = await credentialDatabases.GetTokenAsync(
                new TokenRequestContext([scope]),
                cancellationToken);
    
            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        }
    })
    {
        connection.Open();
    }
    

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

Диаграмма, показывающая управляемые идентичности, назначенные пользователем и системой.

Эти типы сценариев подробно рассматриваются в рекомендациях по наилучшим методам использования управляемых удостоверений.

Следующие шаги

Из этого учебника вы узнали, как выполнить переход приложения на подключение без пароля. Дополнительные сведения см. в следующих ресурсах для изучения концепций, описанных в этой статье.