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


Учебник: Подключение приложения App Service к базе данных SQL от имени авторизованного пользователя

В этом руководстве показано, как включить встроенную проверку подлинности в приложении App Service с помощью поставщика проверки подлинности Microsoft Entra, а затем расширить его, подключив к серверной базе данных SQL Azure, действуя от имени вошедшего пользователя (также известного как поток от имени). Это более продвинутый подход подключения, который используется в Руководстве: доступ к данным с помощью управляемого удостоверения и имеет следующие преимущества в корпоративных сценариях:

  • Устраняет секреты подключения к внутренним службам, аналогично подходу с управляемыми удостоверениями.
  • Предоставляет серверную базу данных (или любую другую службу Azure) больше контроля над тем, кто или сколько предоставляет доступ к своим данным и функциям.
  • Позволяет приложению адаптировать презентацию данных для пользователя, вошедшего в систему.

В этом руководстве описано, как добавить проверку подлинности Microsoft Entra в пример веб-приложения, развернутого в одном из следующих руководств:

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

Схема архитектуры для учебного сценария.

Примечание.

Шаги, описанные в этом руководстве, поддерживаются в следующих версиях:

  • .NET Framework 4.8 и выше
  • .NET 6.0 и выше

Освещаются следующие темы:

  • Включение встроенной проверки подлинности для База данных SQL Azure
  • Отключение других параметров проверки подлинности в База данных SQL Azure
  • Включение аутентификации в Службе приложений
  • Используйте Microsoft Entra ID в качестве поставщика идентификации
  • Доступ к базе данных Azure SQL от имени вошедшего пользователя Microsoft Entra

Примечание.

Проверка подлинности Microsoft Entra отличается от встроенной проверки подлинности Windows в локальной службе Active Directory (AD DS). AD DS и Идентификатор Microsoft Entra используют совершенно разные протоколы проверки подлинности. Для получения дополнительной информации см. документацию по доменным службам Microsoft Entra.

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

Необходимые условия

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

Если вы еще не ознакомились с этими руководствами, сначала изучите одно из них. Кроме того, вы можете адаптировать шаги для своего собственного приложения .NET с Базой данных SQL.

Подготовьте среду к работе с Azure CLI.

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Вариант Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Кнопка запуска Azure Cloud Shell.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Снимок экрана: кнопка

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.

  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.

  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.

  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

1. Настройка сервера базы данных с помощью проверки подлинности Microsoft Entra

Во-первых, включите проверку подлинности Microsoft Entra для База данных SQL, назначив пользователя Microsoft Entra в качестве администратора сервера. Этот пользователь отличается от учетной записи Майкрософт, которую вы использовали для регистрации на подписку Azure. Это должен быть пользователь, которого вы создали, импортировали, синхронизировали или пригласили в Microsoft Entra ID. Дополнительные сведения о разрешенных пользователях Microsoft Entra см. в разделе о функциях и ограничениях Microsoft Entra в базе данных SQL.

  1. Если у клиента Microsoft Entra еще нет пользователя, создайте его, выполнив действия по добавлению или удалению пользователей с помощью идентификатора Microsoft Entra.

  2. Найдите идентификатор объекта пользователя Microsoft Entra, используя az ad user list и замените <user-principal-name>. Результат сохраняется в переменной.

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)
    

    Совет

    Чтобы просмотреть список всех основных имен пользователей в Microsoft Entra ID, выполните команду az ad user list --query [].userPrincipalName.

  3. Добавьте этого пользователя Microsoft Entra в качестве администратора Active Directory с помощью az sql server ad-admin create команды в Cloud Shell. В следующей команде замените <server-name> именем сервера (без суффикса .database.windows.net).

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    
  4. Ограничьте проверку подлинности сервера базы данных проверкой подлинности Active Directory. Этот шаг эффективно отключает проверку подлинности SQL.

    az sql server ad-only-auth enable --resource-group <group-name> --name <server-name>
    

Дополнительные сведения о добавлении администратора Active Directory см. в статье "Подготовка администратора Microsoft Entra" (База данных SQL).

2. Включение проверки подлинности пользователей для приложения

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

  1. В меню портала Azure выберите Группы ресурсов или выполните поиск по запросу Группы ресурсов на любой странице и выберите этот пункт.

  2. В группах ресурсов найдите и выберите группу ресурсов, а затем выберите свое приложение.

  3. В левом меню вашего приложения выберите Проверка подлинности, затем выберите Добавить поставщика удостоверений.

  4. На странице «Добавление поставщика удостоверений» выберите Microsoft в качестве поставщика удостоверений для входа в учетные записи Microsoft и Microsoft Entra.

  5. Примите параметры по умолчанию и нажмите кнопку "Добавить".

    Снимок экрана: страница для добавления поставщика удостоверений.

Совет

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

3. Настройка имперсонации пользователя для базы данных SQL

В настоящее время ваше приложение Azure подключается к базе данных SQL с использованием проверки подлинности SQL (имя пользователя и пароль), управляемой в параметрах приложения. На этом шаге вы предоставляете приложению разрешения на доступ к База данных SQL от имени пользователя Microsoft Entra, вошедшего в систему.

  1. На странице проверки подлинности приложения выберите имя приложения в разделе "Поставщик удостоверений". Регистрация этого приложения была автоматически создана для вас. В меню слева выберите Разрешения API.

  2. Выберите Добавить разрешение, а затем — Интерфейсы API, используемые моей организацией.

  3. Введите База данных SQL Azure в поле поиска и выберите результат.

  4. На странице разрешений API запросов для База данных SQL Azure выберите делегированные разрешения и user_impersonation, а затем нажмите кнопку "Добавить разрешения".

    Снимок экрана со страницей запроса разрешений API, где выбраны элементы

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

Регистрация приложения в Microsoft Entra ID теперь имеет необходимые разрешения для подключения к базе данных SQL от имени вошедшего в систему пользователя. Затем вы настроите приложение App Service, чтобы предоставить вам доступный токен доступа.

В Cloud Shell выполните следующие команды в приложении, чтобы добавить scope параметр в параметр identityProviders.azureActiveDirectory.login.loginParametersпроверки подлинности. Он использует [jq] для обработки JSON, которая уже установлена в Cloud Shell.

authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"

Команды успешно добавляют свойство loginParameters с дополнительными настраиваемыми областями. Ниже приведено описание запрошенной области:

  • openid, profile и email уже запрашиваются службой приложений по умолчанию. Дополнительные сведения см. в разделе Области OpenID Connect.
  • https://database.windows.net/user_impersonationссылается на База данных SQL Azure. Это область, которая предоставляет JWT, которая включает базу данных SQL в качестве аудитории токенов.
  • offline_access приведен здесь для удобства (если требуется обновить маркеры).

Совет

Чтобы настроить необходимые области с помощью веб-интерфейса, см. шаги от Microsoft на обновление токенов аутентификации.

Теперь ваши приложения настроены. Теперь приложение может создать маркер, который База данных SQL принимает.

5. Используйте маркер доступа в коде приложения

Действия, которые необходимо выполнить для проекта, зависят от того, что вы используете: Entity Framework (по умолчанию для ASP.NET) или Entity Framework Core (по умолчанию для ASP.NET Core).

  1. В Visual Studio откройте консоль диспетчер пакетов и обновите Entity Framework:

    Update-Package EntityFramework
    
  2. В объекте DbContext (в Models/MyDbContext.cs) добавьте в конструктор по умолчанию следующий код.

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    conn.AccessToken = System.Web.HttpContext.Current.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    

Примечание.

Код добавляет токен доступа, предоставленный аутентификацией службы приложений, в объект подключения.

Это изменение кода не работает локально. Дополнительные сведения см. в разделе Как выполнять локальную отладку при использовании проверки подлинности App Service?.

6. Публикация изменений

  1. Если вы пришли из руководства: Создание приложения ASP.NET в Azure с помощью SQL Database, вы настроили строку подключения в Службе приложений с помощью проверки подлинности SQL с именем пользователя и паролем. Используйте следующую команду, чтобы удалить секреты подключения, но замените имя группы, имя<>

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings MyDbConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    
  2. Публикация изменений в Visual Studio. В обозревателе решений щелкните правой кнопкой мыши проект DotNetAppSqlDb и выберите Опубликовать.

    Снимок экрана, показывающий, как публиковать из обозревателя решений в Visual Studio.

  3. На странице публикации выберите команду Опубликовать.

Когда на новой веб-странице отображается список действий, приложение подключается к базе данных от имени пользователя Microsoft Entra, вошедшего в систему.

Приложение Azure после выполнения Code First Migration

Теперь вы должны иметь возможность редактировать список дел как раньше.

7. Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:

az group delete --name <group-name>

Ее выполнение может занять до минуты.

Часто задаваемые вопросы

Почему возникает Login failed for user '<token-identified principal>'. ошибка?

Наиболее распространенными причинами этой ошибки являются:

Как добавить других пользователей или группы Microsoft Entra в базе данных SQL Azure?

  1. Подключитесь к серверу базы данных, например, с использованием sqlcmd или SSMS.

  2. Создание изолированных пользователей, сопоставленных с удостоверениями Microsoft Entra в документации по базе данных SQL.

    Следующий пример Transact-SQL добавляет удостоверение Microsoft Entra в SQL Server и предоставляет ей некоторые роли базы данных:

    CREATE USER [<user-or-group-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<user-or-group-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<user-or-group-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<user-or-group-name>];
    GO
    

Как я могу отлаживать локально при использовании аутентификации службы приложений?

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

  • Подключитесь к SQL-базе данных из локальной среды с помощью Active Directory Interactive. Поток аутентификации не авторизует пользователя в приложении, но подключается к базе данных back-end с вошедшим пользователем и позволяет вам тестировать авторизацию в базе данных локально.
  • Скопируйте маркер доступа вручную из https://<app-name>.azurewebsites.net/.auth/me в ваш код вместо заголовка запроса X-MS-TOKEN-AAD-ACCESS-TOKEN.
  • При развертывании из Visual Studio используйте удаленную отладку приложения Служба приложений.

Что происходит при истечении срока действия маркеров доступа?

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

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

Чему вы научились:

  • Включение встроенной проверки подлинности для База данных SQL Azure
  • Отключение других параметров проверки подлинности в База данных SQL Azure
  • Включение аутентификации в Службе приложений
  • Используйте Microsoft Entra ID в качестве источника удостоверений
  • Доступ к базе данных SQL Azure от имени пользователя Microsoft Entra, выполнившего вход