Проверка подлинности в ресурсах Azure из приложений .NET, размещенных в локальной среде

Приложения, размещенные за пределами Azure (например, локально или в стороннем центре обработки данных), должны использовать субъект-службу приложений для проверки подлинности в Azure при доступе к ресурсам Azure. Объекты субъекта-службы приложений создаются с помощью процесса регистрации приложений в Azure. При создании субъекта-службы приложения для приложения будет создан идентификатор клиента и секрет клиента. Затем идентификатор клиента, секрет клиента и идентификатор клиента хранятся в переменных среды, чтобы их можно было использовать библиотекой удостоверений Azure для проверки подлинности приложения в Azure во время выполнения.

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

1. Регистрация приложения в Azure

Приложение можно зарегистрировать в Azure с помощью портал Azure или Azure CLI.

Войдите на портал Azure и сделайте следующее.

Instructions Снимок экрана
В портал Azure:
  1. Введите регистрации приложений в строке поиска в верхней части портал Azure.
  2. Выберите элемент, помеченный Регистрация приложений под заголовком "Службы" в меню, которое отображается под строкой поиска.
Снимок экрана: использование верхней панели поиска в портал Azure для поиска и перехода на страницу Регистрация приложений.
На странице Регистрация приложений нажмите кнопку +Создать регистрацию. Снимок экрана: расположение кнопки
На странице регистрации приложения заполните форму следующим образом:
  1. Имя → Введите имя регистрации приложения в Azure. Это имя рекомендуется включить имя приложения и среду (test, prod), для которой выполняется регистрация приложения.
  2. Поддерживаемые типы учетных записей → учетные записи только в этом каталоге организации.
Выберите "Зарегистрировать", чтобы зарегистрировать приложение и создать субъект-службу приложений.
Снимок экрана, на котором показано, как заполнить страницу регистрации приложения, указав имя приложения и указав поддерживаемые типы учетных записей в качестве учетных записей только в этом каталоге организации.
На странице регистрации приложения:
  1. Идентификатор приложения (клиента) → Это идентификатор приложения, который приложение будет использовать для доступа к Azure во время локальной разработки. Скопируйте это значение во временное расположение в текстовом редакторе, так как он понадобится на следующем шаге.
  2. Идентификатор каталога (клиента) → Это значение также потребуется приложению при проверке подлинности в Azure. Скопируйте это значение во временное расположение в текстовом редакторе, оно также потребуется на следующем шаге.
  3. Учетные данные клиента → Необходимо задать учетные данные клиента для приложения, прежде чем приложение сможет пройти проверку подлинности в Azure и использовать службы Azure. Выберите " Добавить сертификат или секрет ", чтобы добавить учетные данные для приложения.
Снимок экрана страницы регистрации приложений после завершения регистрации приложения. На этом снимке экрана показано расположение идентификатора приложения и идентификатора клиента, который потребуется на следующем шаге. В нем также отображается расположение ссылки, используемой для добавления секрета приложения для приложения.
На странице "Сертификаты и секреты" выберите +Создать секрет клиента. Снимок экрана: расположение ссылки, используемой для создания нового секрета клиента на странице сертификатов и секретов.
Диалоговое окно "Добавление секрета клиента" появится в правой части страницы. В этом диалоговом окне:
  1. Описание → Введите значение Current.
  2. Истекает срок действия → Выберите значение 24 месяцев.
Нажмите кнопку "Добавить ", чтобы добавить секрет.

ВАЖНО. Задайте напоминание в календаре до даты окончания срока действия секрета. Таким образом, вы можете добавить новый секрет до истечения срока действия этого секрета и избежать прерывания работы службы в приложении.
Снимок экрана: страница, на которой добавляется новый секрет клиента для субъекта-службы приложения, созданного процессом регистрации приложения.
На странице "Сертификаты и секреты" отобразится значение секрета клиента.

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

ВАЖНО. Это единственный раз, когда вы увидите это значение. После выхода или обновления этой страницы вы не сможете снова увидеть это значение. Вы можете добавить дополнительный секрет клиента, не отменив этот секрет клиента, но вы не увидите это значение еще раз.
Снимок экрана: страница с созданным секретом клиента.

2. Назначение ролей субъекту-службе приложений

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

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

Перейдите к группе ресурсов, выбрав имя группы ресурсов в заголовке "Группы ресурсов" в диалоговом окне.
Снимок экрана: использование верхнего поля поиска в портал Azure для поиска и перехода к группе ресурсов, которой требуется назначить роли (разрешения).
На странице группы ресурсов выберите элемент управления доступом (IAM) в меню слева. Снимок экрана: страница группы ресурсов с расположением элемента меню управления доступом (IAM).
На странице управления доступом (IAM):
  1. Выберите вкладку Назначения ролей.
  2. Выберите + Добавить в верхнем меню, а затем выберите Добавить назначение роли в появившемся раскрывающемся меню.
Снимок экрана: переход на вкладку назначений ролей и расположение кнопки, используемой для добавления назначений ролей в группу ресурсов.
На странице "Добавление назначения ролей" перечислены все роли, которые можно назначить для группы ресурсов.
  1. Используйте поле поиска, чтобы отфильтровать список до более управляемого размера. В этом примере показано, как фильтровать роли BLOB-объектов хранилища.
  2. Выберите роль, которую вы хотите назначить.
Нажмите кнопку "Далее ", чтобы перейти к следующему экрану.
Снимок экрана: фильтрация и выбор назначений ролей для добавления в группу ресурсов.
На следующей странице "Добавление назначения ролей" можно указать, какой пользователь назначит роль.
  1. Выберите "Пользователь", "Группа" или "Субъект-служба" в разделе "Назначение доступа".
  2. Выберите и выберите участников в разделе "Участники".
Диалоговое окно откроется справа от портал Azure.
Снимок экрана: переключатель для назначения роли группе Microsoft Entra и ссылке, используемой для назначения роли.
В диалоговом окне выбора элементов:
  1. Текстовое поле Select можно использовать для фильтрации списка пользователей и групп в подписке. При необходимости введите первые несколько символов субъекта-службы, созданного для приложения, чтобы отфильтровать список.
  2. Выберите субъект-службу, связанный с приложением.
Выберите в нижней части диалогового окна, чтобы продолжить.
Снимок экрана: фильтрация и выбор группы Microsoft Entra для приложения в диалоговом окне
Теперь субъект-служба будет отображаться как выбранный на экране добавления назначения ролей.

Выберите "Рецензирование" и " Назначить" , чтобы перейти на окончательную страницу, а затем проверить и назначить еще раз, чтобы завершить процесс.
Снимок экрана, на котором показана завершенная страница

3. Настройка переменных среды для приложения

Объект DefaultAzureCredential будет искать учетные данные субъекта-службы в наборе переменных среды во время выполнения. Существует несколько способов настройки переменных среды при работе с .NET в зависимости от инструментов и среды.

Независимо от выбранного подхода настройте следующие переменные среды при работе с субъектом-службой:

  • AZURE_CLIENT_ID → значение идентификатора приложения.
  • AZURE_TENANT_ID → Значение идентификатора клиента.
  • AZURE_CLIENT_SECRET → пароль или учетные данные, созданные для приложения.

Если приложение размещено в СЛУЖБАх IIS, рекомендуется задать переменные среды для каждого пула приложений, чтобы изолировать параметры между приложениями.

appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost

Эти параметры также можно настроить непосредственно с помощью applicationPools элемента внутри applicationHost.config файла:

<applicationPools>
   <add name="CorePool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic">
      <environmentVariables>
         <add name="ASPNETCORE_ENVIRONMENT" value="Development" />
         <add name="AZURE_CLIENT_ID" value="00000000-0000-0000-0000-000000000000" />
         <add name="AZURE_TENANT_ID" value="11111111-1111-1111-1111-111111111111" />
         <add name="AZURE_CLIENT_SECRET" value="=abcdefghijklmnopqrstuvwxyz" />
      </environmentVariables>
   </add>
</applicationPools>

4. Реализация DefaultAzureCredential в приложении

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

Порядок и расположения, в которых DefaultAzureCredential поиск учетных данных найден в DefaultAzureCredential.

Чтобы использовать DefaultAzureCredential, добавьте Azure.Identity и при необходимости пакеты Microsoft.Extensions.Azure в приложение:

В выбранном терминале перейдите к каталогу проекта приложения и выполните следующие команды:

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

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

  1. Azure.Identity Включите пространства имен и Microsoft.Extensions.Azure пространства имен с помощью using директив.
  2. Зарегистрируйте клиент службы Azure с помощью соответствующего Addметода расширения с префиксом.
  3. Передайте экземпляр DefaultAzureCredential UseCredential метода.

Например:

using Microsoft.Extensions.Azure;
using Azure.Identity;

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));
    clientBuilder.UseCredential(new DefaultAzureCredential());
});

UseCredential Альтернативой является создание экземпляра DefaultAzureCredential напрямую:

using Azure.Identity;

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

Когда предыдущий код выполняется на локальной рабочей станции разработки, он выглядит в переменных среды для субъекта-службы приложений или локально установленных средств разработчика, таких как Visual Studio, для набора учетных данных разработчика. Любой подход можно использовать для проверки подлинности приложения в ресурсах Azure во время локальной разработки.

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