Доступ к службе хранилища Azure из веб-приложения с помощью управляемых удостоверений
Узнайте, как с помощью управляемых удостоверений получить доступ к службе хранилища Azure для веб-приложения (не от имени вошедшего в систему пользователя), выполняемого в Службе приложений Azure.
Предположим, что вам нужен доступ из веб-приложения к плоскости данных Azure (к службе хранилища Azure, Базе данных SQL Azure, Azure Key Vault или другим службам). Вы могли бы использовать общий ключ, но это создаст дополнительные проблемы с оперативной безопасностью, то есть с распределением прав на создание, развертывание секрета и управление им. Также этот ключ может случайно оказаться отправленным в GitHub, где злоумышленники смогут его найти. Есть более безопасный способ предоставить веб-приложению доступ к данным — применить управляемое удостоверение.
Управляемое удостоверение из идентификатора Microsoft Entra позволяет Служба приложений получать доступ к ресурсам с помощью управления доступом на основе ролей (RBAC), не требуя учетных данных приложения. Когда вы назначаете веб-приложению управляемое удостоверение, Azure создает и распространяет сертификат. Вам не придется беспокоиться об управлении секретами или учетными данными приложения.
В этом руководстве описано следующее:
- создавать для веб-приложения управляемое удостоверение, назначаемое системой;
- создавать учетную запись хранения и контейнер хранилища BLOB-объектов Azure;
- обращаться к хранилищу из веб-приложения с помощью управляемых удостоверений.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Необходимые компоненты
- Веб-приложение, выполняющееся в Службе приложений Azure, с включенным модулем проверки подлинности или авторизации Службы приложений.
Включение управляемого удостоверения в приложении
Если вы создавали и публиковали веб-приложение с помощью Visual Studio, управляемое удостоверение уже включено для этого приложения. В Службе приложений в области слева выберите Удостоверение, а затем — Назначаемое системой. Убедитесь, что для параметра Состояние задано значение Вкл. В противном случае выберите Сохранить, а затем — Да, чтобы включить управляемое удостоверение, назначаемое системой. Если управляемое удостоверение включено, для состояния устанавливается значение Вкл. и будет доступен идентификатор объекта.
Это действие создает новый идентификатор объекта, который отличается от идентификатора приложения, созданного на панели Проверка подлинности и авторизация. Скопируйте идентификатор объекта для управляемого удостоверения, назначаемого системой. Оно понадобится вам позже.
Создание учетной записи хранения и контейнера хранилища BLOB-объектов
Теперь вы готовы создать учетную запись хранения и контейнер хранилища BLOB-объектов.
Каждая учетная запись хранения должна принадлежать группе ресурсов Azure. Группа ресурсов — это логический контейнер для группирования служб Azure. При создании учетной записи хранения у вас есть возможность создать новую или использовать имеющуюся группу ресурсов. В этой статье показано, как создать группу ресурсов.
Учетная запись хранения общего назначения версии 2 предоставляет доступ ко всем службам хранилища Azure (большим двоичным объектам, файлам, очередям, таблицам и дискам). С помощью описанной здесь процедуры создается учетная запись хранения общего назначения версии 2, но создание любого типа учетной записи хранения происходит таким же образом.
Большие двоичные объекты в службе хранилища Azure упорядочиваются в контейнеры. Прежде чем отправлять большой двоичный объект, необходимо создать для него контейнер.
Чтобы создать учетную запись хранения общего назначения версии 2 на портале Azure, сделайте следующее:
В меню портала Azure выберите Все службы. В списке ресурсов введите Учетные записи хранения. Как только вы начнете вводить символы, список отфильтруется соответствующим образом. Выберите Учетные записи хранения.
В появившемся окне Учетные записи хранения выберите Создать.
Выберите подписку, в которой будет создана учетная запись хранения.
В поле Группа ресурсов выберите из раскрывающегося списка ту группу ресурсов, в которой размещено веб-приложение.
Далее введите имя своей учетной записи хранения. Выбранное вами имя должно быть уникальным в Azure. Также имя должно содержать от 3 до 24 символов и может состоять только из цифр и строчных букв.
Выберите расположение учетной записи хранения или используйте расположение по умолчанию.
В поле "Производительность" выберите параметр "Стандартный".
Для избыточности выберите параметр локально избыточного хранилища (LRS) в раскрывающемся списке.
Выберите "Рецензирование ", чтобы просмотреть параметры учетной записи хранения и создать учетную запись.
Нажмите кнопку создания.
Чтобы создать контейнер хранилища BLOB-объектов в службе хранилища Azure, выполните следующие действия:
Войдите в новую учетную запись хранения на портале Azure.
На странице учетной записи хранения в меню слева перейдите в раздел Хранилище данных и выберите Контейнеры.
Нажмите кнопку + Контейнер.
Введите имя для нового контейнера. Имя контейнера должно содержать символы только буквы нижнего регистра, цифры и символ дефиса (-), и может начинаться только с буквы или цифры.
Задайте уровень общего доступа к контейнеру. По умолчанию используется уровень Частный (без анонимного доступа).
Щелкните Создать, чтобы создать контейнер.
Предоставление доступа к учетной записи хранения
Чтобы получить возможность создавать, считывать и удалять большие двоичные объекты, вам необходимо предоставить веб-приложению доступ к учетной записи хранения. На предыдущем шаге вы настроили управляемое удостоверение для веб-приложения, которое выполняется в Службе приложений. С помощью Azure RBAC вы можете предоставить этому управляемому удостоверению доступ к ресурсу, как и любому другому субъекту безопасности. Роль "Участник для данных BLOB-объектов хранилища" предоставляет веб-приложению (которое представлено этим управляемым удостоверением, назначаемым системой) доступ на чтение, запись и удаление самого контейнера больших двоичных объектов и данных в нем.
Примечание.
Некоторые операции с частными контейнерами BLOB-объектов не поддерживаются Azure RBAC, например просмотр больших двоичных объектов или копирование больших двоичных объектов между учетными записями. Контейнер BLOB-объектов с частным уровнем доступа требует маркер SAS для любой операции, которая не авторизована Azure RBAC. Дополнительные сведения см. в разделе "Когда следует использовать подписанный URL-адрес".
На портале Azure откройте страницу учетной записи хранения, чтобы предоставить доступ веб-приложению. В области слева выберите Управление доступом (IAM), а затем — Назначение ролей. Вы увидите список субъектов, которым разрешен доступ к учетной записи хранения. Теперь вам нужно добавить назначение роли для робота, то есть службы приложений, которая будет обращаться к этой учетной записи хранения. Выберите Добавить>Добавить назначение ролей, чтобы открыть страницу Добавление назначения ролей.
На вкладке "Тип назначения" выберите тип функции задания и нажмите кнопку "Далее".
На вкладке "Роль" выберите роль участника данных BLOB-объектов хранилища в раскрывающемся списке и нажмите кнопку "Далее".
На вкладке "Члены" выберите "Назначить доступ к управляемому> удостоверению", а затем выберите "Члены".> В окне "Выбор управляемых удостоверений" найдите и выберите управляемое удостоверение, созданное для Служба приложений в раскрывающемся списке "Управляемое удостоверение". Выберите кнопку Выбрать.
Выберите "Проверка" и "Назначить ", а затем нажмите кнопку "Рецензирование" и "Еще раз назначить ".
Подробные инструкции см. в статье Назначение ролей Azure с помощью портала Microsoft Azure.
Теперь веб-приложение сможет обращаться к этой учетной записи хранения.
Доступ к хранилищу BLOB-объектов
Класс DefaultAzureCredential используется для получения учетных данных токена для кода, чтобы авторизовать запросы в службу хранилища Azure. Создайте экземпляр класса DefaultAzureCredential, который использует управляемое удостоверение для получения токенов и их подключения к клиенту службы. Приведенный ниже пример кода получает учетные данные токена с пройденной проверкой подлинности и использует их для создания объекта клиента службы, который отправляет новый большой двоичный объект.
Просмотреть этот код как часть примера приложения можно на сайте GitHub.
Установка пакетов клиентских библиотек
Установите пакет NuGet хранилища BLOB-объектов для работы с хранилищем BLOB-объектов и клиентской библиотекой удостоверений Azure для пакета NuGet .NET для проверки подлинности с помощью учетных данных Microsoft Entra. Установите клиентские библиотеки с помощью интерфейса командной строки .NET или консоли диспетчер пакетов в Visual Studio.
Интерфейс командной строки.NET
Откройте командную строку и перейдите в каталог с файлом проекта.
Выполните команды установки.
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
Консоль диспетчера пакетов
Откройте проект или решение в Visual Studio, а затем — консоль с помощью команды Средства>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
Выполните команды установки.
Install-Package Azure.Storage.Blobs
Install-Package Azure.Identity
Пример
using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;
// Some code omitted for brevity.
static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
// Construct the blob container endpoint from the arguments.
string containerEndpoint = string.Format("https://{0}.blob.core.windows.net/{1}",
accountName,
containerName);
// Get a credential and create a client object for the blob container.
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
new DefaultAzureCredential());
try
{
// Create the container if it does not exist.
await containerClient.CreateIfNotExistsAsync();
// Upload text to a new block blob.
byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);
using (MemoryStream stream = new MemoryStream(byteArray))
{
await containerClient.UploadBlobAsync(blobName, stream);
}
}
catch (Exception e)
{
throw e;
}
}
Очистка ресурсов
Если вы завершили работу с этим учебником и вам больше не требуется веб-приложение или связанные с ним ресурсы, необходимо очистить созданные ресурсы.