Настройка чистого кода авторизации в Azure App Service
Узнайте, почему Azure App Service использует гибридный поток OAuth2 и как настроить поток авторизации кода для веб‑приложений. Руководство с советами устранению ошибок.
Почему сервис приложений Azure, требующий аутентификации, настаивает на инициации гибридного потока (response_type=code id_token), а не только на потоке авторизационного кода? У меня есть веб‑приложение Azure Linux с Easy Auth, настроенным на требование аутентификации, перенаправляющее неаутентифицированные запросы на вход. После входа после доступа к корневому пути (/) меня перенаправляют обратно на маршрут /.auth/login/aad/callback с ошибкой, указывающей, что id_token response_type не разрешён. Я понимаю это и не хочу разрешать гибридный поток. Даже когда я устанавливаю implicit_id_token_issuance_enabled = true, я могу войти, но это не должно быть необходимо для конфигурации redirect_uris типа Web, которая должна использовать только поток авторизационного кода. Я пытался настроить параметры входа, чтобы указать response_type=code, что переопределяет первоначальный вызов, но затем во время обратного вызова аутентификации вместо ошибки мы попадаем в цикл, где Azure AD говорит «вы вошли», но Easy Auth отвечает «у меня нет всего, что мне нужно (id_token), поэтому перенаправить на Azure AD». Как я могу настроить аутентификацию Azure так, чтобы использовать только поток авторизационного кода без гибридного потока?
Azure‑аутентификация‑требуемый сервис приложения требует инициацию гибридного потока, потому что Easy Auth предназначен для предоставления как аутентификации (через id_token), так и авторизации (через access_token) по умолчанию. Такое поведение возникает, когда Easy Auth настроен с параметрами «Express», которые автоматически включают гибридный поток, чтобы ваше приложение получало как ID‑токен для идентификации пользователя, так и токен доступа для API, упрощая процесс аутентификации в большинстве сценариев.
Содержание
- Понимание поведения Easy Auth по умолчанию
- Почему гибридный поток вынужден
- Настройка чистого потока авторизации кода
- Устранение цикла аутентификации
- Альтернативные подходы к настройке
- Лучшие практики выбора потока OAuth2
Понимание поведения Easy Auth по умолчанию
Azure App Service Easy Auth предназначен для предоставления готовых к использованию возможностей аутентификации с минимальной настройкой. При включении аутентификации в портале Azure система по умолчанию использует гибридный OAuth2‑поток, который сочетает поток авторизации кода с характеристиками имплицитного потока.
Согласно официальной документации Microsoft, Easy Auth предоставляет встроенные возможности аутентификации и авторизации, позволяющие войти пользователям и получить доступ к данным с минимумом кода. Гибридный поток (response_type=code id_token) становится стандартом, потому что он предлагает несколько преимуществ:
- Мгновенная информация о пользователе: id_token предоставляет данные о пользователе сразу после аутентификации
- Безопасный обмен токенами: код авторизации позволяет безопасно обменять токены на сервере
- Один проход аутентификации: пользователи могут пройти аутентификацию и авторизацию за один шаг
Проблема, с которой вы сталкиваетесь, возникает потому, что конфигурация по умолчанию Easy Auth предполагает, что вам нужны и токен аутентификации, и токен авторизации, даже если ваше приложение может потребовать только код авторизации для обмена токенами на сервере.
Почему гибридный поток вынужден
Сопротивление гибридному потоку связано с тем, как Easy Auth обрабатывает аутентификацию и авторизацию внутри. Как отмечено в обсуждении на Stack Overflow по этой же проблеме, модуль Easy Auth ожидает получить как код авторизации, так и id_token во время первоначального обратного вызова.
Когда вы настраиваете Easy Auth с «authentication required» и указываете перенаправление неаутентифицированных пользователей, система автоматически:
- Инициирует OAuth2‑поток с параметрами по умолчанию
- Запрашивает как
code, так иid_tokenв ответе - Ожидает наличие обоих токенов во время обработки обратного вызова
Документация Microsoft identity platform объясняет, что гибридный поток фактически представляет собой поток авторизации кода с дополнительными элементами — требованием ID‑токена, что и вызывает ваши конфигурационные сложности.
Цикл, который вы наблюдаете, возникает потому, что:
- Easy Auth запрашивает
response_type=code id_token - Azure AD отвечает обоими токенами
- Easy Auth обрабатывает обратный вызов, но определяет, что необходима дополнительная настройка
- Система перенаправляет обратно в Azure AD, создавая бесконечный цикл
Настройка чистого потока авторизации кода
Чтобы получить чистый поток авторизации кода, необходимо более глубоко изменить конфигурацию Easy Auth. Ниже приведены шаги:
Метод 1: Расширенная настройка через Resource Explorer
Самый надёжный способ — использовать Azure Resource Explorer для прямого изменения настроек аутентификации:
- Перейдите к вашему App Service в портале Azure
- Откройте Resource Explorer из раздела Development Tools
- Перейдите к
config > authsettings - Отредактируйте конфигурацию, чтобы включить следующие параметры:json
{ "additionalLoginParams": ["resource=<Your-App-ID-URI>"], "platform": { "enabledPolicies": ["Login"] } }
Как упомянуто в посте Microsoft Community Hub, указание параметра resource помогает Easy Auth понять, что ему следует обменять код авторизации на токен доступа, а не ожидать id_token.
Метод 2: Настройка через ARM‑шаблон
Для большего контроля разверните ваш App Service с помощью ARM‑шаблона, содержащего конкретные настройки аутентификации:
{
"properties": {
"siteConfig": {
"authSettings": {
"enabled": true,
"unauthenticatedClientAction": "RedirectToLoginPage",
"tokenStoreEnabled": true,
"clientId": "<your-client-id>",
"issuer": "<your-issuer>",
"allowedAudiences": ["<your-app-id-uri>"],
"additionalLoginParams": ["resource=<your-app-id-uri>"],
"clientSecret": "<your-client-secret>"
}
}
}
}
Метод 3: Настройка через Azure CLI
Использование команд Azure CLI также может помочь настроить правильный поток:
az webapp auth update \
--name <app-name> \
--resource-group <resource-group> \
--enabled true \
--action LoginWithAzureActiveDirectory \
--facebook-action None \
--google-action None \
--microsoft-account-action None \
--twitter-action None \
--client-id <client-id> \
--client-secret <client-secret> \
--issuer-uri <issuer-uri> \
--allowed-audiences <app-id-uri>
Устранение цикла аутентификации
Цикл аутентификации, который вы наблюдаете, возникает из-за того, что Easy Auth и Azure AD работают в противоречии. Вот как это исправить:
Включение выдачи ID‑токена
Как вы обнаружили, установка implicit_id_token_issuance_enabled = true позволяет потоку работать, но это не идеальное решение. Это фактически включает компонент имплицитного потока, который ожидает Easy Auth.
Настройка правильного URI перенаправления
Убедитесь, что в регистрации приложения Azure AD указан правильный URI перенаправления:
- Формат:
https://<your-app-name>.azurewebsites.net/.auth/login/aad/callback - Тип: Web платформа
- Убедитесь, что этот URI перенаправления указан в разделе Authentication вашей регистрации приложения
Проверка настроек проверки токенов
В вашей регистрации приложения убедитесь, что:
- Access tokens включены в разделе «Token configuration»
- ID tokens включены, если вам нужны данные о пользователе
- Настройки «Implicit grant» правильно сконфигурированы
Ответ на Stack Overflow указывает, что вам необходимо явно включить как access tokens, так и ID tokens в настройках аутентификации регистрации приложения.
Альтернативные подходы к настройке
Ручный обмен токенами
Если вы не можете настроить Easy Auth на использование чистого потока авторизации кода, рассмотрите возможность реализации ручного обмена токенами в вашем приложении:
- Используйте Easy Auth для получения кода авторизации
- Обменяйте код на токены с помощью логики на сервере
- Подтвердите и используйте токены по мере необходимости
Пользовательский middleware аутентификации
Для более сложных сценариев реализуйте пользовательский middleware аутентификации, который:
- Перехватывает обратный вызов Easy Auth
- Обрабатывает обмен токенами вручную
- Предоставляет соответствующий ответ вашему приложению
Использование MSAL.js для фронтенд‑аутентификации
Если у вас есть фронтенд‑компонент, рассмотрите возможность использования Microsoft Authentication Library (MSAL.js) для самостоятельного управления чистым потоком авторизации кода, независимо от Easy Auth.
Лучшие практики выбора потока OAuth2
При выборе между гибридным потоком и чистым потоком авторизации кода учитывайте следующие факторы:
Выберите гибридный поток, если:
- Вам нужна мгновенная информация о пользователе в фронтенде
- Вы хотите минимизировать дополнительные вызовы API
- Архитектура вашего приложения выигрывает от наличия обоих токенов
- Вы используете встроенные функции проверки токенов Easy Auth
Выберите чистый поток авторизации кода, если:
- Вам нужна максимальная безопасность за счёт минимизации раскрытия токенов
- Вы хотите полный контроль над обработкой токенов
- Ваш сервер должен самостоятельно проверять токены
- Вы реализуете собственную логику аутентификации
Документация Microsoft identity platform предоставляет подробные рекомендации о том, когда использовать каждый тип потока в зависимости от требований вашего приложения.
Источники
- Microsoft Learn – Аутентификация и авторизация в Azure App Service
- Stack Overflow – Azure App Service аутентификация принуждает гибридный поток
- Microsoft identity platform – Документация по потоку авторизации кода OAuth2
- Microsoft Community Hub – EasyAuth и потоки Azure AD
- Stack Overflow – Включение ID‑токенов в Azure AD
- Microsoft Learn – Поток авторизации кода в Azure AD B2C
Заключение
В итоге ключевые моменты по настройке Azure App Service Easy Auth для использования чистого потока авторизации кода:
- Easy Auth по умолчанию использует гибридный поток для удобства и мгновенной доступности
- Цикл аутентификации возникает из‑за ожидания обоих токенов
- Настройка через Resource Explorer является самым надёжным способом принудить чистый поток авторизации кода
- Правильные настройки регистрации приложения критичны для успешного обмена токенами
- Ручная обработка токенов может потребоваться, если Easy Auth не может быть настроен как требуется
Для вашего конкретного сценария рекомендую использовать метод Resource Explorer, чтобы изменить additionalLoginParams и включить ваш ресурс, что должно позволить использовать чистый поток авторизации кода без осложнений гибридного потока. Если проблемы сохраняются, рассмотрите внедрение пользовательской логики аутентификации, обходящей поведение Easy Auth, при этом сохраняя преимущества безопасности Azure AD.