Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Служба приложений Azure обеспечивает встроенную проверку подлинности (часто называемую EasyAuth), которая обрабатывает вход пользователей перед запросами к приложению. Конструктор API данных может считывать сведения об удостоверениях, которые App Service внедряет, обеспечивая аутентификацию без непосредственного управления токенами.
Это важно
Поставщик AppService доверяет заголовкам удостоверений, переданным EasyAuth. Убедитесь, что клиенты не могут обойти EasyAuth и получить доступ к построителю API данных напрямую.
Поток аутентификации
Когда Data API Builder выполняется за Azure App Service с включенной проверкой подлинности, Azure App Service обрабатывает поток OAuth и передает сведения об удостоверении через заголовки HTTP:
| Phase | Что происходит |
|---|---|
| Проверка подлинности пользователя | Служба приложений перехватывает запросы, не прошедшие проверку подлинности, и перенаправляет их к поставщику удостоверений. |
| Инъекция идентификации | После проверки подлинности служба приложений App Service добавляет заголовок X-MS-CLIENT-PRINCIPAL. |
| Обработка DAB | Построитель API данных декодирует заголовок JSON в формате Base64 и создает ClaimsPrincipal из массива claims. |
| Авторизация | DAB использует ClaimsPrincipal.IsInRole() для проверки заголовка X-MS-API-ROLE, а затем оценивает разрешения и политики |
Необходимые условия
- подписка Azure
- Служба приложений Azure или функции Azure (инфраструктура службы приложений)
- CLI для построителя API данных (руководство по установке)
- Существующая
dab-config.json, содержащая по крайней мере одну сущность
Краткий справочник
| Setting | Ценность |
|---|---|
| Поставщик | AppService |
| Заголовок идентификации |
X-MS-CLIENT-PRINCIPAL (JSON в кодировке Base64) |
| Заголовок выбора ролей | X-MS-API-ROLE |
| Поддерживает пользовательские утверждения | Да |
| Локальное тестирование | Да (вручную задать заголовки) |
Шаг 1. Включение проверки подлинности службы приложений
Настройка проверки подлинности в Службе приложений Azure:
На портале Azure перейдите в службу приложений.
Выберите Настройки>Проверка подлинности.
Выберите Добавить поставщик удостоверений.
Выберите корпорацию Майкрософт (или другой поддерживаемый поставщик).
Настройте параметры:
- Тип регистрации приложения: создание или выбор существующего
- Поддерживаемые типы учетных записей: выбор в зависимости от сценария
- Ограничение доступа. Требовать проверку подлинности
Нажмите кнопку "Добавить".
Подсказка
Проверка подлинности службы приложений работает с несколькими поставщиками удостоверений, включая Microsoft, Google, Facebook, Twitter и OpenID Connect.
Шаг 2. Настройка построителя API данных
Установите поставщика аутентификации на AppService
CLI
dab configure \
--runtime.host.authentication.provider AppService
Итоговая конфигурация
{
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
}
}
Замечание
В отличие от поставщиков EntraID или /, AzureAD не требует настроек Custom или AppService. Служба приложений проверяет токен перед передачей информации о личности в DAB.
Шаг 3. Настройка разрешений сущности
Определите разрешения для ролей. Построитель API данных оценивает роли через ClaimsPrincipal.IsInRole(), путем проверки утверждений, извлеченных из заголовка X-MS-CLIENT-PRINCIPAL. Включите утверждения роли в массив claims с соответствующим типом роли.
Пример конфигурации
# Allow authenticated users to read
dab update Book \
--permissions "authenticated:read"
# Allow editors to create and update
dab update Book \
--permissions "editor:create,read,update"
Итоговая конфигурация
{
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update"]
}
]
}
}
}
Шаг 4. Тестирование локально с помощью X-MS-CLIENT-PRINCIPAL
Проверку подлинности службы приложений можно проверить локально, указав X-MS-CLIENT-PRINCIPAL заголовок вручную. Этот подход имитирует то, что EasyAuth перенаправит в ваше приложение и позволяет тестировать поведение, основанное на ролях и утверждениях, без необходимости развертывания в Azure.
Создание субъекта-клиента
Заголовок X-MS-CLIENT-PRINCIPAL содержит объект JSON в кодировке Base64. Построитель API данных анализирует следующие свойства:
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "Alice Smith" },
{ "typ": "email", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" },
{ "typ": "http://schemas.microsoft.com/identity/claims/objectidentifier", "val": "abc-123-def" }
]
}
Кодирование субъекта
Закодируйте JSON в формат Base64. Вы можете использовать любое средство:
PowerShell.
$json = @'
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}
'@
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($json))
Бить:
echo '{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}' | base64
Отправка запроса с заголовком
curl -X GET "http://localhost:5000/api/Book" \
-H "X-MS-CLIENT-PRINCIPAL: eyJpZGVudGl0eVByb3ZpZGVyIjoiYWFkIiwidXNlcklkIjoidXNlci0xMjM0NSIsInVzZXJEZXRhaWxzIjoiYWxpY2VAY29udG9zby5jb20iLCJ1c2VyUm9sZXMiOlsiYXV0aGVudGljYXRlZCIsImVkaXRvciJdfQ==" \
-H "X-MS-API-ROLE: editor"
Структура X-MS-CLIENT-PRINCIPAL
Построитель API данных анализирует следующие свойства из субъекта-клиента:
| Недвижимость | Тип | Описание |
|---|---|---|
auth_typ |
струна | Тип проверки подлинности (например, aad). Требуется для проверки подлинности удостоверения. |
name_typ |
струна | (Необязательно) Тип утверждения, используемый для имени пользователя |
role_typ |
струна | (Необязательно) Тип утверждения, используемый для ролей (по умолчанию roles) |
claims |
object[] | Массив утверждений со свойствами typ и val. Роли должны быть включены здесь в качестве утверждений. |
Это важно
Роли оцениваются с помощью ClaimsPrincipal.IsInRole(), который проверяет массив claims на наличие утверждений, соответствующих role_typ. Включите каждую роль в качестве отдельной записи утверждения (например, { "typ": "roles", "val": "editor" }).
Использование утверждений в политиках базы данных
С помощью поставщика AppService можно использовать утверждения в политиках базы данных. Эта возможность обеспечивает безопасность на уровне строк на основе удостоверения пользователя.
Пример. Фильтрация по идентификатору объекта пользователя
В этом примере используется утверждение oid (идентификатор объекта), которое Microsoft Entra ID включает в токены:
{
"entities": {
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}
Подсказка
Распространенные типы утверждений из Microsoft Entra ID включают oid (идентификатор объекта), email, name и preferred_username. Используйте точную строку типа утверждения от поставщика удостоверений.
Доступные ссылки на утверждения
Ссылки на утверждения используют точную строку типа утверждения из массива claims :
| Ссылка на требование | Описание |
|---|---|
@claims.<claim-type> |
Любое утверждение, находящееся в массиве claims, которое соответствует свойству typ. |
Например, если ваш основной код содержит { "typ": "email", "val": "alice@contoso.com" }, используйте @claims.email в вашей политике. Тип утверждения должен совпадать точно.
Анонимные запросы
Если служба приложений разрешает неаутентифицированные запросы или при локальном тестировании без заголовка X-MS-CLIENT-PRINCIPAL, промежуточное программное обеспечение для проверки подлинности API данных автоматически задает заголовок X-MS-API-ROLE как anonymous. Затем запросы оцениваются с помощью роли anonymous.
# No principal header = anonymous role (X-MS-API-ROLE set automatically)
curl -X GET "http://localhost:5000/api/Book"
Для анонимного anonymous доступа к работе сущность должна иметь разрешения для роли:
{
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
}
]
}
Troubleshooting
| Симптом | Возможная причина | Решение |
|---|---|---|
401 Unauthorized (или перенаправление для входа) |
EasyAuth заблокировал запрос, прежде чем он достиг DAB | Войдите через EasyAuth или отправьте допустимые учетные данные; Проверка параметров проверки подлинности службы приложений |
403 Forbidden |
Роль отсутствует в списке разрешений | Добавьте роль к разрешениям сущности |
403 Forbidden |
X-MS-API-ROLE не входит в роли пользователя |
Убедитесь, что заголовок соответствует заявлению о роли в массиве основного элемента claims |
| Утверждения недоступны | Отсутствующий claims массив в принципале клиента |
Добавление утверждений в X-MS-CLIENT-PRINCIPAL JSON |
| Роль не распознана | Роли, которые не входят в массив claims |
Добавьте утверждения роли с правильными role_typ (например, { "typ": "roles", "val": "editor" }) |
| Сбой локального тестирования | Заголовок не закодирован в кодировке Base64 | Правильное кодирование JSON перед отправкой |
Полный пример конфигурации
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONNECTION_STRING')"
},
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
},
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
},
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update", "delete"]
}
]
},
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}