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


Настройка проверки подлинности службы приложений (EasyAuth)

Служба приложений Azure обеспечивает встроенную проверку подлинности (часто называемую EasyAuth), которая обрабатывает вход пользователей перед запросами к приложению. Конструктор API данных может считывать сведения об удостоверениях, которые App Service внедряет, обеспечивая аутентификацию без непосредственного управления токенами.

Это важно

Поставщик AppService доверяет заголовкам удостоверений, переданным EasyAuth. Убедитесь, что клиенты не могут обойти EasyAuth и получить доступ к построителю API данных напрямую.

Поток аутентификации

Когда Data API Builder выполняется за Azure App Service с включенной проверкой подлинности, Azure App Service обрабатывает поток OAuth и передает сведения об удостоверении через заголовки HTTP:

Иллюстрация потока аутентификации в службе приложений, демонстрирующая, как EasyAuth внедряет заголовки удостоверений.

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:

  1. На портале Azure перейдите в службу приложений.

  2. Выберите Настройки>Проверка подлинности.

  3. Выберите Добавить поставщик удостоверений.

  4. Выберите корпорацию Майкрософт (или другой поддерживаемый поставщик).

  5. Настройте параметры:

    • Тип регистрации приложения: создание или выбор существующего
    • Поддерживаемые типы учетных записей: выбор в зависимости от сценария
    • Ограничение доступа. Требовать проверку подлинности
  6. Нажмите кнопку "Добавить".

Подсказка

Проверка подлинности службы приложений работает с несколькими поставщиками удостоверений, включая 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"
              }
            }
          ]
        }
      ]
    }
  }
}