Научитесь использовать удостоверения и токены в веб-приложениях и Azure SQL

1. Введение

Python Flask - популярный инструмент для создания веб-приложений. Используя Azure AD, пользователи могут проходить аутентификацию в REST API и получать данные из Azure SQL. В этом блоге образец веб-приложения Python создается следующим образом:

  • 1a: Пользователь входит в веб-приложение и получает токен
  • 1b: пользователь вызывает REST API для запроса набора данных
  • 2. Веб-приложение использует утверждения в токене для проверки доступа пользователя к набору данных.
  • 3. Веб-приложение извлекает данные из Azure SQL. Веб-приложение может быть настроено так, что для аутентификации в базе данных используется либо а) управляемое удостоверение приложения, либо б) удостоверение пользователя, выполнившего вход.

Код проекта можно найти здесь, архитектуру - ниже.

В оставшейся части этого блога выполняются следующие шаги:

  • Шаг 1. Получите токен и вызовите API с помощью токена
  • Шаг 2. Подтвердите заявки в токене
  • Шаг 3а: Аутентификация с управляемой идентификацией приложения
  • Шаг 3b: сквозная аутентификация вошедшего в систему пользователя

Чтобы узнать, как получить доступ к серверной части функций Azure с помощью делегированных разрешений или разрешений приложения, см. Мой последующий блог, в котором используется то же репозиторий git, что и в этом блоге.

Шаг 1. Получите токен и вызовите API с помощью токена

В этом примере показано, как создать веб-приложение Python с помощью Flask и MSAL Python, которое выполняет вход в систему и получает доступ к базе данных SQL Azure. Дополнительные сведения о том, как протоколы работают в этом сценарии и других сценариях, см. В разделе Сценарии проверки подлинности для Azure AD. На этом шаге выполняются следующие подэтапы:

  • 1.1: Предварительные мероприятия
  • 1.2: Создание и настройка регистрации приложения
  • 1.3: Настроить проект python webapp
  • 1.4: Запустите образец

Шаг 1 фокусируется на следующей части архитектуры.

1.1: Предварительные мероприятия

Для запуска этого примера вам понадобятся:

  • Python 2.7+ или Python 3+
  • Клиент Azure Active Directory (Azure AD). Дополнительные сведения о том, как получить клиент Azure AD, см. В разделе Как получить клиент Azure AD.
  • Git, чтобы клонировать следующий проект: git clone https://github.com/rebremer/ms-identity-python-webapp-backend.gitили загрузите и извлеките файл .zip репозитория.

1.2: Создание и настройка регистрации приложения

Создайте и настройте регистрацию приложения следующим образом:

  • Создайте регистрацию приложения, следуя инструкциям по этой ссылке, чтобы создать регистрацию приложения. Два замечания:
  • Используйте http://localhost/getAToken в качестве URL-адреса ответа. Если вы не сделали этого во время создания, его можно добавить с помощью вкладки Аутентификация при регистрации приложения.
  • Перейдите в Аутентификация и включите параметр «Токены идентификатора» в «Неявном предоставлении».
  • Перейдите в Сертификаты и секреты, чтобы создать секрет. Скопируйте client_id и секрет клиента

1.3: Настроить проект pythonwebapp

  1. Откройте файл app_config.py и измените переменные ниже.
  2. Найдите текст <<Enter_the_Client_Secret_here>> и замените его секретом приложения во время создания регистрации приложения на шаге 1.2.
  3. Найдите текст <<Enter_the_Tenant_Name_Here>> и замените существующее значение именем своего клиента Azure AD.
  4. Найдите текст <<Enter_the_Application_Id_here>> и замените существующее значение идентификатором приложения (clientId) регистрации приложения на шаге 1.2.

1.4: Запустите образец

Вам нужно будет установить зависимости с помощью pip следующим образом:

$ pip install -r requirements.txt

Запустите app.py из оболочки или командной строки, используя следующую команду:

flask run --host localhost --port 5000

Когда приложение запускается локально, его может посетить localhost: 5000 (а не 127.0.0.1:5000). После шага 1 пользователи могут войти в систему, используя свои учетные данные Azure AD. На следующем этапе задаются роли пользователей, которые можно использовать для проверки того, разрешено ли пользователю получать данные с помощью API.

Шаг 2. Подтвердите заявки в токене

На этом этапе могут быть установлены утверждения в токенах, которые могут быть просто веб-приложением для проверки того, разрешено ли пользователю вызывать API. См. Ссылку эта для получения дополнительной информации о заявках на токены. Выполняются следующие подэтапы:

  • 2.1: Установить конфигурацию в конфигурации приложения
  • 2.2: Добавить роли в манифест
  • 2.3: Назначьте пользователя роли

Шаг 2 фокусируется на следующей части архитектуры.

2.1: Установить конфигурацию в конфигурации приложения

Проверка заявки - необязательный шаг, который можно включить с помощью следующих настроек в app_config.py файле: AAD_ROLE_CHECK = True.

2.2: Добавить роли в манифест

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

"appRoles": [
  {
    "allowedMemberTypes": ["User"],
    "description": "Basic user, only read product data from SQLDB",
    "displayName": "basic_user_access",
    "id": "a8161423-2e8e-46c4-9997-f984faccb625",
    "isEnabled": true,
    "value": "basic_user_access"
  },
  {
    "allowedMemberTypes": ["User"],
    "description": "Premium user, read all data from SQLDB",
    "displayName": "premium_user_access",
    "id": "b8161423-2e8e-46c4-9997-f984faccb625",
    "isEnabled": true,
    "value": "premium_user_access"
  }
],

2.3: Назначьте пользователя роли

Назначение пользователей объясняется в ссылке. В качестве теста можно создать двух пользователей. Пользователю 1 назначается basic_user_access, а пользователю 2 - роль premium_user_access.

На следующем этапе создается база данных Azure SQL, и идентификатор приложения используется для извлечения данных из базы данных.

Шаг 3а. Аутентификация с помощью идентификаторов, управляемых приложением

На этом шаге управляемое удостоверение приложения используется для извлечения данных, которые связаны с регистрацией приложения, созданной на шаге 1. Выполняются следующие подэтапы:

  • 3a.1: Создание базы данных Azure SQL
  • 3a.2: Установите конфигурацию в конфигурации приложения

Шаг 3а фокусируется на следующей части архитектуры.

3a.1: Создание базы данных Azure SQL

Создайте базу данных Azure SQL, используя эту ссылку, в которой можно выбрать самый дешевый SKU (базовый). Убедитесь, что выполнено следующее:

  • AdvertureWorks устанавливается как образец базы данных, можно выбрать самую дешевую базу данных (SKU basic).
  • Добавьте удостоверение приложения в качестве пользователя в базу данных SQL Azure с правильными ролями читателей, см. Пример ниже.
CREATE USER [<<Name of app registration>>] FROM EXTERNAL PROVIDER;
EXEC sp_addrolemember [db_datareader], [<<Name of app registration>>];

3a.2: Установите конфигурацию в конфигурации приложения

Для backend_settings необходимо установить базу данных. Также убедитесь, что соединение заполнено вашими настройками. Поскольку используется идентификатор MI приложения, разрешения application_permissions должны указывать на «https://database.windows.net//.default» в файле app_config.py, см. Также ниже.

# 2. Type of BACKEND
#
# Option 2a. Database
BACKEND_SETTINGS = {"Type": "Database", "Connection":{"SQL_SERVER": "<<Enter_logical_SQL_server_URL_here>>.database.windows.net", "DATABASE": "<<Enter_SQL_database_name_here>>"}}
# Option 3a. Delegated user is used to authenticate to Graph API, MI is then used to authenticate to backend
...
APPLICATION_PERMISSIONS = ["https://database.windows.net//.default"]

Теперь приложение можно запустить, как описано в шаге 1.4. Когда вы нажимаете ссылку (Premium users only) Get Customer data from Database, извлекаются данные о клиенте. Впоследствии при нажатии на ссылку Get Product data from Database извлекаются данные о продукте (при условии, что утверждения установлены правильно для пользователя на шаге 2 или проверка отключена)

На этом этапе удостоверение приложения используется для получения данных. Однако идентификационные данные пользователя также могут быть переданы (сквозная передача AAD) для извлечения данных из базы данных.

Шаг 3b: сквозная аутентификация вошедшего в систему пользователя

На этом этапе для получения данных используется личность самого пользователя. Это означает, что токен, созданный на шаге 1 для входа в веб-приложение, также используется для аутентификации в базе данных. Выполняются следующие подэтапы:

  • 3b.1: Добавление области БД Azure SQL к регистрации приложения
  • 3b.2: Добавить пользователя AAD в базу данных
  • 3b.3: Установить конфигурацию в конфигурации приложения

Шаг 3b фокусируется на следующей части архитектуры.

3b.1: Добавление области БД Azure SQL к регистрации приложения

  • Измените регистрацию приложения, созданную на шаге 1.2. с разрешениями для базы данных Azure SQL в качестве делегированного пользователя. Это объясняется в этой ссылке.
  • Важно: для базы данных SQL Azure требуется согласие администратора. Это можно сделать, выбрав Согласие Grant_admin для каталога по умолчанию на вкладке разрешения или во время выполнения при входе в систему.

3b.2: Добавить пользователя AAD в базу данных

Поскольку на этом этапе используется сквозная передача AAD, сами пользователи должны иметь соответствующие роли в SQLDB в качестве внешнего пользователя и носителя данных. См. Пример, как это сделать, ниже.

CREATE USER [<<AAD user email address>>] FROM EXTERNAL PROVIDER;
EXEC sp_addrolemember [db_datareader], [<<AAD user email address>>];

Если вы хотите быть более детализированным в ролях в базе данных, read_customer считывает данные из SalesLT.Customer, тогда как read_product считывает данные из SalesLT.Product)

3b.3: Установить конфигурацию в конфигурации приложения

Сквозную аутентификацию пользователя AAD можно настроить в файле app_config.py, установив для delegated_permissions значение [«https://sql.azuresynapse-dogfood.net/user_impersonation»], см. Также ниже

# Option 3b. Delegated user is used to authenticate to backend, graph API disabled
...
DELEGATED_PERMISSONS = ["https://sql.azuresynapse-dogfood.net/user_impersonation"]

Теперь приложение можно запустить, как описано в шаге 1.4, в котором данные могут быть извлечены из базы данных с использованием идентификатора вошедшего в систему пользователя.

Заключение

В этом блоге создается веб-приложение Python, которое извлекает данные из SQLDB. Утверждения пользователей, управляемые удостоверения и сквозные токены пользователей, вошедших в систему, обсуждаются для проверки подлинности и авторизации пользователей для получения данных из Azure SQL, см. Также обзор ниже.