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


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

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

Управляемые удостоверения — это рекомендуемый способ проверки подлинности для безопасных подключений без пароля между ресурсами 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.

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

Diagram showing the user assigned identity relationships.

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

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

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

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

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

    Screenshot showing how to assign a system assigned managed identity.

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

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

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

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

    Screenshot showing how to assign a system-assigned identity.

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

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

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

    Screenshot showing how to select a system-assigned identity.

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

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

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

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

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

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

Примечание.

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

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

В проекте добавьте ссылку на пакет NuGet Azure.Identity. Эта библиотека содержит все необходимые сущности для реализации DefaultAzureCredential. Вы также можете добавить другие библиотеки Azure, относящиеся к вашему приложению. В этом примере выполняется добавление пакетов Azure.Storage.Blobs и Azure.KeyVault.Keys для подключения к хранилищу BLOB-объектов и Key Vault.

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.KeyVault.Keys

В начало файла Program.cs добавьте следующие операторы using:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;

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

var blobServiceClient = new BlobServiceClient(
    new Uri("https://<your-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential(credOptions));

var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");

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

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

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

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

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

Diagram showing multiple user-assigned managed identities.

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

  • Два подключения к отдельным учетным записям хранения с помощью управляемого удостоверения, назначаемого пользователем
  • Подключение к Azure Cosmos DB и службам Azure SQL с помощью второго общего управляемого удостоверения, назначаемого пользователем
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");

// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });

// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
    new Uri("https://<contract-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });


// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");

// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDdatabases
    });

// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ClientIDOfTheManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";

using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
    conn.Open();
}

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

Diagram showing user-assigned and system-assigned managed identities.

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

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

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