Подписывание запросов API на Azure App Services с использованием маркера доступа MSI

adamcunnington спросил: 12 мая 2018 в 04:07 в: azure

У меня есть веб-приложение, работающее в Azure App Services. Интерфейс (javascript + html + css) связывается с бэкэндом (флягой). Оба запускаются в одном экземпляре службы приложений.

Мое приложение защищено аутентификацией Active Directory (настроено с использованием Azure Portal).

Пользовательская аутентификация приложения отлично работает. Когда пользователь переходит к приложению, они перенаправляются на логин для нашего арендатора AD. Когда они пытаются войти в систему, их разрешение на приложение контролируется их членством в лазурной группе AD. Этот бит работает как ожидалось

Задача состоит в том, что переднему интерфейсу необходимо отправить аутентифицированные запросы, чтобы они могли фактически достичь бэкэнд. Они должны быть аутентифицированы с использованием токена основного сервиса, а не токена пользователя. И для этого мы используем новый рекомендованный подход; Идентификатор управляемой службы (MSI), а не рабочий процесс главной учетной записи службы.

Для этого есть 2 этапа:

1) Добавление заголовка авторизации2) Обеспечение доступа к основному лицу MSI (т. е. принадлежит к группе AD)

1) Сервер генерирует токен доступа, используя следующий код:

credentials = azure_active_directory.MSIAuthentication()
session = credentials.signed_session()
return session.headers.get("Authorization")

Затем мы добавляем {"Authorization" : "Bearer"}, где результат приведенного выше кода.

Кажется, что это работает как ожидалось - мы видим длинные буквенно-цифровые маркеры доступа

2) Сложный бит заключался в том, что MSI был добавлен в группу AD. Графические интерфейсы на myapps.microsoft.com и mygroups.microsoft.com позволяют добавлять пользователей. Вместо этого я использовал CLI Azure и выполнил следующее:

a) Получить главный идентификатор MSI msiobjectid=$(az webapp identity show --resource-group <resource-group-name> --name <azure app services name> --query principalId)

b) Добавить участника в группу az ad group member add --group <group name> --member-id $msiobjectid

Мы по-прежнему получаем 401 Unauthorized, и мы исчерпали всю документацию: (

Я должен отметить, что я только завершен шаг 2 (добавление принципала в лазурную группу AD через Azure CLI) около часа назад. Возможно, есть задержка?

Изменить: мой сценарий ближе всего к https://github.com/uglide /azure-content/blob/master/articles/app-service-api/app-service-api-dotnet-service-principal-auth.md, за исключением a) Я пользуюсь MSI, а не директором прямой службы и b) I имеют дополнительный уровень авторизации, который является группами объявлений, ограничивая доступ к приложению нескольким пользователям, а не всему арендатору.

1 ответ

evilSnobu ответил: 12 мая 2018 в 08:15

Я считаю, что вы все это сделали назад.

Ваш сценарий - это бэкэнд SPA +.

Что вам нужно реализовать, это неявный поток предоставления OAuth 2.0, как описано здесь.

Источник для диаграммы: dzimchuk.net

p> С полученным в результате access_token, размещенным в хранилище сеансов пользовательского агента, вы можете вызвать ваш сервер. Используйте adal.js, чтобы облегчить вашу жизнь.

Поскольку ваш клиентский интерфейс Python IS конфиденциальный клиент, теперь вы можете запросить токен доступа с конечной точки MSI для желаемой аудитории (Azure ресурс), вызовите его, затем отфильтруйте результаты, чтобы он соответствовал вашей логике прав доступа.

Обратите внимание, что на момент написания только подмножество ресурсов Azure может потреблять маркеры доступа, выпущенные MSI.

adamcunnington ответил: 13 мая 2018 в 07:43
Я принял ваш совет ... Я сделал внешний интерфейс для отправки запросов на задний план, используя токен доступа пользователя, а не токен MSI. Затем API может использовать маркер MSI, когда ему необходимо взаимодействовать с лазурными ресурсами. Вместо отправки запроса с лицевой стороны мой конец "перед обработчиком запроса" добавляет заголовок авторизации. Тем не менее, я получаю ошибку CORS, которая кажется глупой. login.windows.net отклоняет мой запрос из моего приложения, потому что он не позволяет происходить. Я, очевидно, не контролирую этот домен, и аутентификация была настроена с использованием портала. Есть идеи?