Доступ к AD обеспечен Azure Функция через AJAX - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть Azure Настройка функции с конечной точкой веб-триггера, которую я хочу использовать в качестве бэкэнда для приложения React. Без настройки аутентификации работает нормально. Когда я настраиваю аутентификацию службы приложений с помощью AD, она работает нормально, когда я получаю доступ напрямую через браузер (после аутентификации), но когда я пытаюсь получить доступ с JS, предоставляя токен на предъявителя, я получаю 401.

const response = await axios.get(`${window.apiUrl}api/jobs`, {
    headers: {
      'Content-Type': 'application/json',
      Authorization: 'Bearer ' + token.accessToken,
    },
  });

Клиентское приложение работает на Azure и зарегистрировано как Azure приложение AD. Я могу аутентифицироваться, запрашивать AD и успешно использовать MS Graph API.

Я использую встроенную Azure аутентификацию AD служб приложений. У меня установлен идентификатор клиента, такой же идентификатор клиента, как у ранее упомянутого приложения Azure AD, а также тот же URL-адрес эмитента.

Попытка получить токен сеанса:

const accessToken = await authProvider.getAccessToken();
const idToken = await authProvider.getIdToken();
const login = await axios.post(
  'https://<appname>.azurewebsites.net/.auth/login/aad',
    { access_token: accessToken.accessToken },
    {
      headers: {
        'Content-Type': 'application/json',
      },
    },
  );

Подробнее

Моя претензия по аудиту 00000003-0000-0000-c000-000000000000. В Azure Portal моя функция Azure настроена на использование того же приложения Azure AD, что и мой SPA. Я использую MSAL. js для аутентификации в моем SPA. Я запрашиваю области User.Read и Directory.Read.All.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Microsoft опубликовала статью с практическими рекомендациями под названием Расширенное использование аутентификации и авторизации в Azure Служба приложений . В разделе, посвященном проверке токенов от провайдеров , говорится:

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

Таким образом, вам нужно получить маркер сеанса для доступа к ресурсам приложения.

Запрос:

POST https://<appname>.azurewebsites.net/.auth/login/aad HTTP/1.1
Content-Type: application/json

{"id_token":"<token>","access_token":"<token>"}

Ответ:

{
    "authenticationToken": "...",
    "user": {
        "userId": "sid:..."
    }
}

enter image description here

Получив этот токен сеанса (authenticationToken), вы можете получить доступ к защищенным ресурсам приложения, добавив заголовок X-ZUMO-AUTH к своим HTTP-запросам

GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>
0 голосов
/ 08 февраля 2020

Вы не можете запросить токен для Microsoft Graph и использовать его для вызова собственного API. Аудитория «00000003-0000-0000-c000-000000000000» означает «предназначена для Microsoft Graph».

В MSAL, когда вы запрашиваете токен, вам необходимо настроить области. Удалите User.Read, удалите Directory.Read.All и добавьте «URI идентификатора приложения» с /.default в конце. URI идентификатора приложения можно найти в колонке «Expose a API» регистрации вашего приложения на портале. azure .com. Пример: https://SaeedApp/.default

Если вам нужно сделать оба, вы можете запросить токен доступа только для одного ресурса за раз. Однако вы можете запросить столько областей, сколько вам нужно для одного ресурса (User.Read и Directory.Read.All обе области для одного и того же ресурса).

Так что вам нужно будет сделать два набора запросов : 1) получить токен доступа со всеми областями, необходимыми для Microsoft Graph 2) получить токен доступа со всеми областями, необходимыми для API

Причина, по которой: Если я могу взять получить доступ к токену, который предназначен для вашего API, и вызвать с ним Microsoft Graph, тогда это откроет «повторные» атаки, когда один Ресурсный API взломан, и хакер, управляющий одним ресурсом, теперь может отвечать токенам доступа, которые он получает от клиентов, против всех остальных Ресурсов. API-интерфейсы.

...