Проверка подлинности в ресурсах Azure из приложений .NET, размещенных в локальной среде
Статья
Приложения, размещенные за пределами Azure (например, локально или в стороннем центре обработки данных), должны использовать субъект-службу приложений для проверки подлинности в Azure при доступе к ресурсам Azure. Объекты субъекта-службы приложений создаются с помощью процесса регистрации приложений в Azure. При создании субъекта-службы приложения для приложения будет создан идентификатор клиента и секрет клиента. Затем идентификатор клиента, секрет клиента и идентификатор клиента хранятся в переменных среды, чтобы они могли использоваться пакетом SDK azure для .NET для проверки подлинности приложения в Azure во время выполнения.
Для каждой среды необходимо создать другую регистрацию приложения, в которой размещено приложение. Это позволяет настроить разрешения конкретного ресурса среды для каждого субъекта-службы и убедиться, что приложение, развернутое в одной среде, не разговаривает с ресурсами Azure, которые являются частью другой среды.
1. Регистрация приложения в Azure
Приложение можно зарегистрировать в Azure с помощью портал Azure или Azure CLI.
Введите регистрации приложений в строке поиска в верхней части портал Azure.
Выберите элемент, помеченный Регистрация приложений под заголовком "Службы" в меню, которое отображается под строкой поиска.
На странице Регистрация приложений нажмите кнопку +Создать регистрацию.
На странице регистрации приложения заполните форму следующим образом.
Имя → Введите имя регистрации приложения в Azure. Это имя рекомендуется включить имя приложения и среду (test, prod), для которой выполняется регистрация приложения.
Поддерживаемые типы учетных записей → учетные записи только в этом каталоге организации.
Выберите "Зарегистрировать", чтобы зарегистрировать приложение и создать субъект-службу приложений.
На странице регистрации приложения:
Идентификатор приложения (клиента) → Это идентификатор приложения, который приложение будет использовать для доступа к Azure во время локальной разработки. Скопируйте это значение во временное расположение в текстовом редакторе, так как он понадобится на следующем шаге.
Идентификатор каталога (клиента) → Это значение также потребуется приложению при проверке подлинности в Azure. Скопируйте это значение во временное расположение в текстовом редакторе, оно также потребуется на следующем шаге.
Учетные данные клиента → Необходимо задать учетные данные клиента для приложения, прежде чем приложение сможет пройти проверку подлинности в Azure и использовать службы Azure. Выберите " Добавить сертификат или секрет ", чтобы добавить учетные данные для приложения.
На странице "Сертификаты и секреты" выберите +Создать секрет клиента.
Диалоговое окно "Добавление секрета клиента" появится в правой части страницы. В этом диалоговом окне:
Описание → Введите значение Current.
Истекает срок действия → Выберите значение 24 месяцев.
Нажмите кнопку "Добавить ", чтобы добавить секрет.
ВАЖНО. Задайте напоминание в календаре до даты окончания срока действия секрета. Таким образом, вы можете добавить новый секрет до истечения срока действия этого секрета и избежать прерывания работы службы в приложении.
На странице "Сертификаты и секреты" отобразится значение секрета клиента.
Скопируйте это значение во временное расположение в текстовом редакторе, так как он понадобится на следующем шаге.
ВАЖНО. Это единственный раз, когда вы увидите это значение. После выхода или обновления этой страницы вы не сможете снова увидеть это значение. Вы можете добавить дополнительный секрет клиента без недопустимого этого секрета клиента, но вы не увидите это значение снова.
az ad sp create-for-rbac --name <app-name>
Выходные данные команды будут похожи на следующие. Запишите эти значения или оставьте это окно открытым, так как эти значения потребуются на следующем шаге и не смогут снова просмотреть значение пароля (секрет клиента).
Затем необходимо определить, какие роли (разрешения) приложения требуются для ресурсов и назначить эти роли приложению. Роли можно назначить в ресурсе, группе ресурсов или подписке область. В этом примере показано, как назначать роли для субъекта-службы в группе ресурсов область так как большинство приложений группируют все ресурсы Azure в одну группу ресурсов.
Найдите группу ресурсов для приложения, найдите имя группы ресурсов с помощью поля поиска в верхней части портал Azure.
Перейдите к группе ресурсов, выбрав имя группы ресурсов в заголовке "Группы ресурсов" в диалоговом окне.
На странице группы ресурсов выберите элемент управления доступом (IAM) в меню слева.
На странице управления доступом (IAM):
Выберите вкладку Назначения ролей.
Выберите + Добавить в верхнем меню, а затем выберите Добавить назначение роли в появившемся раскрывающемся меню.
На странице "Добавление назначения ролей" перечислены все роли, которые можно назначить для группы ресурсов.
Используйте поле поиска, чтобы отфильтровать список до более управляемого размера. В этом примере показано, как фильтровать служба хранилища ролях BLOB-объектов.
Выберите роль, которую вы хотите назначить.
Нажмите кнопку "Далее ", чтобы перейти к следующему экрану.
На следующей странице "Добавление назначения ролей" можно указать, какой пользователь назначит роль.
Выберите "Пользователь", "Группа" или "Субъект-служба" в разделе "Назначение доступа".
Выбор и выбор элементов в разделе "Элементы"
Диалоговое окно откроется справа от портал Azure.
В диалоговом окне выбора элементов:
Текстовое поле Select можно использовать для фильтрации списка пользователей и групп в подписке. При необходимости введите первые несколько символов субъекта-службы, созданного для приложения, чтобы отфильтровать список.
Выберите субъект-службу, связанный с приложением.
Выберите в нижней части диалогового окна, чтобы продолжить.
Теперь субъект-служба будет отображаться как выбранный на экране добавления назначения ролей.
Выберите "Рецензирование" и " Назначить" , чтобы перейти на окончательную страницу, а затем проверить и назначить еще раз, чтобы завершить процесс.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Например, чтобы разрешить субъекту-службе доступ служба хранилища Azure к контейнерам 00000000-0000-0000-0000-000000000000 BLOB-объектов и данным из группы ресурсов msdocs-dotnet-sdk-sdk-auth, необходимо назначить субъекту-службе приложения роль участника данных служба хранилища с помощью следующей команды.
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-dotnet-sdk-auth-example"
Объект 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 файла.
Переменные среды для Windows можно задать из командной строки. Однако при использовании этого подхода значения доступны всем приложениям, работающим в этой операционной системе, и могут привести к конфликтам, если вы не осторожны. Переменные среды можно задать на уровне пользователя или системы.
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"
# Set system environment variables - requires running as admin
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
Можно также использовать PowerShell для задания переменных среды на уровне пользователя или компьютера.
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
4. Реализация DefaultAzureCredential в приложении
DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет метод проверки подлинности, используемый во время выполнения. Таким образом, приложение может использовать различные методы проверки подлинности в разных средах без реализации конкретного кода среды.
Порядок и расположения, в которых DefaultAzureCredential поиск учетных данных найден в DefaultAzureCredential.
Чтобы реализовать DefaultAzureCredential, сначала добавьте Azure.Identity в приложение пакеты и при необходимости Microsoft.Extensions.Azure . Это можно сделать с помощью командной строки или диспетчер пакетов NuGet.
Щелкните правой кнопкой мыши узел проекта в Visual Studio и выберите пункт "Управление пакетами NuGet". Найдите Azure.Identity в поле поиска и установите соответствующий пакет. Повторите этот процесс для пакета Microsoft.Extensions.Azure , а также.
Службы Azure обычно обращаются с помощью соответствующих клиентских классов из пакета SDK. Эти классы и собственные пользовательские службы должны быть зарегистрированы в файле, чтобы их можно было получить с помощью внедрения зависимостей во Program.cs всем приложении. В ней Program.csвыполните приведенные ниже действия, чтобы правильно настроить службу и DefaultAzureCredential.
Azure.Identity Включите пространства имен с Microsoft.Extensions.Azure помощью инструкции using.
Зарегистрируйте службу Azure с помощью соответствующих вспомогательных методов.
Передайте экземпляр DefaultAzureCredential объекта методу UseCredential .
Пример этого показан в следующем сегменте кода.
using Microsoft.Extensions.Azure;
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
x.UseCredential(new DefaultAzureCredential());
});
Кроме того, вы также можете использовать DefaultAzureCredential службы напрямую без помощи дополнительных методов регистрации Azure, как показано ниже.
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
При запуске приведенного выше кода на локальной рабочей станции во время локальной разработки он будет выглядеть в переменных среды для субъекта-службы приложений или в Visual Studio, VS Code, Azure CLI или Azure PowerShell для набора учетных данных разработчика, который можно использовать для проверки подлинности приложения в ресурсах Azure во время локальной разработки.
При развертывании в Azure этот же код также может пройти проверку подлинности приложения в других ресурсах Azure. DefaultAzureCredential может получать параметры среды и конфигурации управляемых удостоверений для автоматической проверки подлинности в других службах.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.