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


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

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

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

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

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

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

Объекты основного сервиса приложения создаются посредством регистрации приложения в Azure через портал Azure или Azure CLI.

  • Портал Azure
  • Azure CLI
  1. На портале Azure используйте строку поиска, чтобы перейти на страницу App registrations.

  2. На странице Регистрация приложений нажмите кнопку +Создать регистрацию.

  3. На странице Зарегистрировать приложение:

    • В поле Имя введите описательное значение, включающее имя приложения и целевую среду.
    • Для поддерживаемых типов учетных записейвыберите учетные записи только в этом каталоге организации (только клиент Майкрософт — один клиент)или любой вариант, который лучше всего соответствует вашим требованиям.
  4. Выберите Регистрация, чтобы зарегистрировать приложение и создать служебный принципал.

    Скриншот, демонстрирующий, как создать регистрацию приложения на портале Azure.

  5. На странице регистрации приложений скопируйте идентификатор приложения (клиента) и идентификатор каталога (клиента) и вставьте их во временное расположение для последующего использования в конфигурациях кода приложения.

  6. Выберите Добавить сертификат или секрет, чтобы установить учетные данные для приложения.

  7. На странице "Сертификаты и секреты" выберите +Создать секрет клиента.

  8. На панели, открывающейся для добавления секрета клиента, выполните следующие действия:

    • Для описаниявведите значение Current.
    • Для значения «срок действия», оставьте рекомендуемое значение по умолчанию — 180 дней.
    • Нажмите кнопку "Добавить ", чтобы добавить секрет.
  9. На странице сертификатов & секретов скопируйте свойство значения секрета клиента для использования в следующем шаге.

    Замечание

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

Назначение ролей для служебного принципала приложения

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

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

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

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

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

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

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

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

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

Установите переменные среды приложения

Во время выполнения определенные учетные данные из библиотеки удостоверений Azure Identity, такие как DefaultAzureCredential, EnvironmentCredential, и ClientSecretCredential, выполняют поиск информации о служебном объекте в переменных среды в соответствии с соглашением. Существует несколько способов настройки переменных среды при работе с .NET в зависимости от инструментов и среды.

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

  • AZURE_CLIENT_ID: используется для идентификации зарегистрированного приложения в Azure.
  • AZURE_TENANT_ID: идентификатор клиента Microsoft Entra.
  • AZURE_CLIENT_SECRET: секретные учетные данные, созданные для приложения.

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

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }

Аутентифицируйте доступ к службам Azure из вашего приложения

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

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

Добавьте пакет Azure.Identity. В проекте ASP.NET Core также установите пакет Microsoft.Extensions.Azure:

  • Командная строка
  • Диспетчер пакетов NuGet

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

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

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

  1. Включите пространства имен Azure.Identity и Microsoft.Extensions.Azure с помощью директивы using.
  2. Зарегистрируйте клиент службы Azure с помощью соответствующего метода расширения с префиксом Add.
  3. Настройте ClientSecretCredential с помощью tenantId, clientIdи clientSecret.
  4. Передайте экземпляр ClientSecretCredential методу UseCredential.
builder.Services.AddAzureClients(clientBuilder =>
{
    var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
    var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
    var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});

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

var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

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