Проверка подлинности и авторизация в Контейнерах приложений Azure
Контейнеры приложений Azure предоставляют встроенные функции проверки подлинности и авторизации (иногда называемые простой проверкой подлинности), которые позволяют защитить внешнее приложение в контейнере с поддержкой входящего трафика, с минимальным объемом кода или совсем без него.
Дополнительные сведения о проверке подлинности и авторизации см. в следующих руководствах для используемого поставщика.
Зачем использовать встроенную проверку подлинности?
Вам не обязательно использовать эту функцию для проверки подлинности и авторизации. Вы можете использовать пакетные функции безопасности на вашей веб-платформе или написать собственные служебные программы. Но реализация безопасного решения для аутентификации (входа пользователей) и авторизации (предоставления доступа к защищенным данным) может потребовать значительных трудозатрат. Необходимо следовать отраслевым рекомендациям и стандартам и поддерживать актуальность реализации.
Встроенная функция проверки подлинности для контейнерных приложений экономит время и усилия, предоставляя встроенную проверку подлинности с федеративными поставщиками удостоверений. Эти функции позволяют сосредоточить больше времени на разработке приложения и меньше времени на создании систем безопасности.
К преимуществам относятся:
- Контейнеры приложений Azure предоставляют доступ к разным встроенным поставщикам проверки подлинности.
- Встроенные функции проверки подлинности не обязывают использовать конкретный язык или пакет SDK, не требуют опыта безопасности или даже написания любого кода.
- Вы можете интегрироваться с несколькими поставщиками, включая идентификатор Microsoft Entra, Facebook, Google и X.
Поставщики удостоверений
Контейнеры приложений используют федеративную идентификацию, при которой сторонний поставщик управляет удостоверениями пользователей и потоком проверки подлинности. По умолчанию доступны следующие поставщики удостоверений:
Provider | Конечная точка входа | Практическое руководство |
---|---|---|
Платформа удостоверений Майкрософт | /.auth/login/aad |
Платформа удостоверений Майкрософт |
/.auth/login/facebook |
||
GitHub | /.auth/login/github |
GitHub |
/.auth/login/google |
||
X | /.auth/login/x |
X |
Любой поставщик OpenID Connect | /.auth/login/<providerName> |
OpenID Connect |
При использовании одного из этих поставщиков конечная точка входа доступна для проверки подлинности пользователей и для проверки токенов проверки подлинности от поставщика. Вы можете предоставить своим пользователям любое количество таких поставщиков.
Рекомендации по использованию встроенной проверки подлинности
Эта возможность должна использоваться только с протоколом HTTPS. Убедитесь, что в конфигурации входящего трафика приложения контейнера отключен allowInsecure
.
Для контейнера приложения можно настроить проверку подлинности с ограничением или без ограничения доступа к содержимому и API-интерфейсам сайта. Чтобы разрешить доступ к приложению только пользователям, прошедшим проверку подлинности, установите для параметра Ограничить доступ значение Требовать проверку подлинности. Чтобы включить проверку подлинности, не ограничивая доступ, задайте для параметра Ограничить доступ значение Разрешить доступ без проверки подлинности.
По умолчанию каждое приложение контейнера выдает собственный уникальный файл cookie или маркер для проверки подлинности. Вы также можете предоставить собственные ключи подписи и шифрования.
Архитектура функций
Компонент ПО промежуточного слоя для проверки подлинности и авторизации предоставляется платформой и работает в том же контейнере расширения, что и приложение. При включении приложение обрабатывает каждый входящий HTTP-запрос после прохождения через уровень безопасности.
ПО промежуточного слоя платформы выполняет для приложения несколько задач:
- Проверка подлинности пользователей и клиентов с помощью указанных поставщиков удостоверений
- управление сеансом с проверкой подлинности;
- вставка сведений об удостоверении в заголовки HTTP-запросов.
Модуль проверки подлинности и авторизации выполняется в отдельном контейнере, изолированном от кода приложения. Так как контейнер безопасности не выполняется внутри процесса, прямая интеграция с конкретными языковыми платформами невозможна. Однако соответствующие сведения, необходимые вашему приложению, предоставляются в заголовках запросов, как описано в этой статье.
Поток аутентификации
Поток проверки подлинности одинаков для всех поставщиков, но будет различным для разных способов входа в систему: с использованием пакета SDK поставщика или без.
Без пакета SDK поставщика (поток, управляемый сервером или поток сервера): приложение делегирует федеративный вход Контейнерам приложений. Обычно делегация применяется для браузерных приложений, которые предоставляют пользователю страницу поставщика для входа в систему.
С пакетом SDK поставщика (поток, управляемый клиентом или клиентский поток): вход пользователей в приложение на странице поставщика выполняется вручную, а затем приложение отправляет маркер проверки подлинности в Контейнеры приложений для проверки. Такой подход является типичным для приложений без браузера, которые не предоставляют пользователю страницу поставщика для входа. Например, приложение для мобильной платформы может выполнять вход пользователей с использованием пакета SDK поставщика.
Вызовы из доверенного браузерного приложения, размещенного в Контейнерах приложений, к REST API другого приложения в Контейнерах приложений могут проходить проверку подлинности с использованием управляемого сервером потока. Дополнительные сведения см. в разделе "Настройка входа и выхода".
В таблице показаны шаги потока проверки подлинности.
Этап | Без использования пакета SDK поставщика | С использованием пакета SDK поставщика |
---|---|---|
1. Вход пользователя | Перенаправляет клиента к /.auth/login/<PROVIDER> . |
Код клиента выполняет вход пользователя непосредственно через пакет SDK поставщика и получает токен проверки подлинности. Дополнительные сведения см. в документации поставщика. |
2. Действия после проверки подлинности | Поставщик перенаправляет клиент к /.auth/login/<PROVIDER>/callback . |
Код клиента отправляет маркер от поставщика в /.auth/login/<PROVIDER> для проверки. |
3. Установка проверенного сеанса | Контейнеры приложений добавляют в ответ файлы cookie, подтверждающие проверку подлинности. | Контейнеры приложений возвращают собственный токен проверки подлинности в код клиента. |
4. Обработка содержимого, прошедшего проверку подлинности | Клиент включает файлы cookie, прошедшие проверку подлинности, в последующие запросы (автоматически обрабатываются браузером). | Код клиента предоставляет токен проверки подлинности в заголовке X-ZUMO-AUTH . |
Для клиентских браузеров Контейнеры приложений могут автоматически перенаправлять пользователей, не прошедших проверку подлинности, на страницу /.auth/login/<PROVIDER>
. Вы также можете отправить пользователям одну или несколько ссылок /.auth/login/<PROVIDER>
, чтобы они вошли в ваше приложение с использованием поставщика по выбору.
Поведение авторизации
На портале Azure можно изменить параметры проверки подлинности контейнера приложений, чтобы указать требуемое поведение для входящих запросов, не прошедших проверку подлинности. Ниже описаны возможные варианты.
Разрешить доступ без проверки подлинности: в этом варианте авторизация трафика, не прошедшего проверку подлинности, поручается коду приложения. Для запросов, прошедших проверку подлинности, Контейнеры приложений также передают сведения о проверке подлинности в заголовках HTTP. Ваше приложение может использовать полученные в заголовках сведения для принятия решений об авторизации запроса.
Такой вариант обеспечивает большую гибкость в обработке анонимных запросов. Например, он позволяет предоставлять пользователям несколько поставщиков входа. Тем не менее необходимо написать код.
Требовать проверку подлинности: в этом варианте любой трафик к приложению, не прошедший проверку подлинности, отклоняется. Такое отклонение может заключаться в перенаправлении в один из настроенных поставщиков удостоверений. В таких случаях клиент браузера перенаправляется в
/.auth/login/<PROVIDER>
для выбранного поставщика. Если анонимный запрос поступает из собственного мобильного приложения, возвращаемый ответHTTP 401 Unauthorized
. Можно также настроить отклонение на возврат ответаHTTP 401 Unauthorized
илиHTTP 403 Forbidden
для всех запросов.В этом случае в клиентском приложении не нужен код для проверки подлинности. Более точная авторизация, например авторизация для конкретной роли, может выполняться путем проверки утверждений пользователя (см. раздел Access user claims (Доступ к утверждениям пользователя)).
Внимание
Таким образом, ограниченный доступ применяется ко всем вызовам приложения, что может быть нежелательно для приложений, требующих наличия общедоступной домашней страницы (как во многих одностраничных приложениях).
Примечание.
По умолчанию любой пользователь в клиенте Microsoft Entra может запросить маркер приложения из идентификатора Microsoft Entra. Вы можете настроить приложение в Microsoft Entra ID, если хотите предоставить доступ к приложению только определенной группе пользователей.
Настройка входа и выхода
Проверка подлинности контейнерных приложений предоставляет встроенные конечные точки для входа и выхода. Если эта функция включена, эти конечные точки доступны в /.auth
префиксе маршрута в приложении контейнера.
Использование нескольких поставщиков входа
Конфигурация портала не предоставляет способ предоставления пользователям нескольких поставщиков входа (например, Facebook и X). Однако эту функцию можно легко добавить к функциональным возможностям вашего приложения. Для этого необходимо сделать следующее:
Во-первых, на странице Authentication / Authorization (Проверка подлинности и авторизация) на портале Azure настройте все поставщики удостоверений, которые нужно включить.
В раскрывающемся списке Action to take when request is not authenticated (Предпринимаемое действие, если проверка подлинности для запроса не выполнена) выберите Разрешить анонимные запросы (нет действия).
На странице входа, на панели навигации или в любом другом расположении приложения добавьте ссылку входа для каждого включенного поставщика (/.auth/login/<provider>
). Например:
<a href="/.auth/login/aad">Log in with the Microsoft Identity Platform</a>
<a href="/.auth/login/facebook">Log in with Facebook</a>
<a href="/.auth/login/google">Log in with Google</a>
<a href="/.auth/login/x">Log in with X</a>
Когда пользователь выбирает одну из ссылок, для него отображается пользовательский интерфейс соответствующего поставщика.
Чтобы перенаправить пользователя после входа по пользовательскому URL-адресу, используйте параметр строки запроса post_login_redirect_uri
(не следует путать с URI перенаправления в конфигурации поставщика удостоверений). Например, чтобы перенаправить пользователя к /Home/Index
после входа в систему, используйте следующий код HTML:
<a href="/.auth/login/<provider>?post_login_redirect_uri=/Home/Index">Log in</a>
Вход, направляемый клиентом
При входе, направляемом клиентом, приложение выполняет вход пользователя у поставщика удостоверений, используя пакет SDK для определенного поставщика. Затем код приложения отправляет полученный маркер проверки подлинности в Контейнеры приложений на проверку (см. поток проверки подлинности) с помощью запроса HTTP POST.
Чтобы контейнер приложения мог проверять токены поставщика, в нем нужно настроить использование нужного поставщика. Получив токен проверки подлинности у своего поставщика, во время выполнения отправьте токен по адресу /.auth/login/<provider>
для проверки. Например:
POST https://<hostname>.azurecontainerapps.io/.auth/login/aad HTTP/1.1
Content-Type: application/json
{"id_token":"<token>","access_token":"<token>"}
Формат токена незначительно отличается в соответствии с поставщиком. Дополнительные сведения см. в таблице, приведенной ниже.
Значение поставщика | Требуется в тексте запроса | Комментарии |
---|---|---|
aad |
{"access_token":"<ACCESS_TOKEN>"} |
Свойства id_token , refresh_token и expires_in являются необязательными. |
microsoftaccount |
{"access_token":"<ACCESS_TOKEN>"} или {"authentication_token": "<TOKEN>" |
Предпочтительнее использовать authentication_token , а не access_token . Свойство expires_in необязательное. При запросе маркера из служб Live всегда запрашиваются области wl.basic . |
google |
{"id_token":"<ID_TOKEN>"} |
Свойство authorization_code необязательное. authorization_code Предоставление значения добавляет маркер доступа и маркер обновления в хранилище маркеров. Если указано свойство authorization_code , оно может сопровождаться свойством redirect_uri . |
facebook |
{"access_token":"<USER_ACCESS_TOKEN>"} |
Используйте допустимый токен доступа пользователя из Facebook. |
twitter |
{"access_token":"<ACCESS_TOKEN>", "access_token_secret":"<ACCES_TOKEN_SECRET>"} |
|
При успешной проверке токена поставщика API возвращается с authenticationToken
в тексте ответа, который является вашим токеном сеанса.
{
"authenticationToken": "...",
"user": {
"userId": "sid:..."
}
}
Получив этот токен сеанса, вы можете получить доступ к защищенным ресурсам приложений, добавив заголовок X-ZUMO-AUTH
к HTTP-запросам. Например:
GET https://<hostname>.azurecontainerapps.io/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>
Выход из сеанса
Пользователи могут выйти из службы, отправив GET
запрос в конечную точку приложения /.auth/logout
. Запрос GET
выполняет следующие действия.
- Очищает файлы cookie проверки подлинности в текущем сеансе.
- Удаляет текущие маркеры пользователя из хранилища маркеров.
- Выполняет выход на стороне сервера в поставщике удостоверений для Идентификатора Microsoft Entra и Google.
Вот простая ссылка для выхода на веб-странице:
<a href="/.auth/logout">Sign out</a>
По умолчанию успешный выход перенаправляет клиента на URL-адрес /.auth/logout/done
. Можно изменить страницу перенаправления после выхода, добавив параметр запроса post_logout_redirect_uri
. Например:
GET /.auth/logout?post_logout_redirect_uri=/index.html
Обязательно закодируйте значение post_logout_redirect_uri
.
URL-адрес должен размещаться в том же домене, если используются полные URL-адреса.
Доступ к утверждениям пользователей в коде приложения
Для всех языковых платформ Контейнеры приложений предоставляют утверждения из входящего токена в код приложения. Эти утверждения внедряются в заголовки запроса, которые присутствуют и для пользователей, прошедших проверку подлинности, и для клиентских приложений. Эти заголовки невозможно настроить запросами извне, то есть они всегда устанавливаются только Контейнерами приложений. Некоторые примеры заголовков включают:
X-MS-CLIENT-PRINCIPAL-NAME
X-MS-CLIENT-PRINCIPAL-ID
Сведения из этих заголовков можно получить с помощью кода, написанного на любом языке или в любой платформе.
Примечание.
В различных языковых платформах эти заголовки могут быть представлены в коде приложения в различных форматах, например строчными или прописными буквами.
Следующие шаги
Дополнительные сведения о защите контейнера приложения см. в следующих статьях.