Функция Azure с AD auth приводит к 401 несанкционированному при использовании токенов на предъявителя - PullRequest
10 голосов
/ 18 марта 2019

У меня есть очень простая функция Azure в C #, для которой я настроил Azure AD Auth.Я только что использовал настройки Express для создания регистрации приложения в конфигурации функций.

public static class IsAuthenticated
{
    [FunctionName("IsAuthenticated")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "options", Route = null)]
        HttpRequest req,
        ILogger log)
    {
        return new OkObjectResult("You are " + req.HttpContext.User.Identity.Name);
    }
}

Когда я получаю доступ к функции в моем браузере, все работает как положено (если я не вошел в систему, я должен войти в систему и получитьперенаправлен на мой API).Но если я пытаюсь получить доступ к своей функции везде, где нужен токен на предъявителя, я получаю ошибку 401 Unauthorized.Еще более странно, что я также не могу выполнить эту функцию на портале Azure.

image

But the token was aquired without a problem and added to the request:

enter image description here

Я пытался решить эту проблему несколькими способами.Сначала я подумал, что, может быть, это проблема CORS (поскольку у меня также было несколько таких проблем) и просто установил CORS для принятия *, но ничего не изменилось.

Затем я добавил свои конечные точки входа в API в редирект.и попытался установить неявное разрешение, чтобы он также принимал токены доступа, он все еще не работает.

enter image description here

Есть что-то, что я пропустил?Разве экспресс-регистрация регистрации приложения не должна работать только с функциями Azure?

РЕДАКТИРОВАТЬ:

Поместить URL-адрес моего приложения-функции в перенаправления, как предложено @ thomas-schreiter ничего не изменил (я попробовал конфигурацию на скриншоте, а также просто поместил каждое из этих значений отдельно).

enter image description here

РЕДАКТИРОВАТЬ 2:

Я также пытался приобрести токен на предъявителя вручную с Почтальоном , но я все еще сталкиваюсь с401 при вызове моего API.

Ответы [ 5 ]

7 голосов
/ 21 марта 2019

Это потребовалось навсегда, чтобы выяснить это, и в официальных документах об этом очень мало информации.

Но оказывается, что проблема заключалась в том, что функции Azure не поддерживают токены Bearer, сгенерированные API-интерфейсом oauth2 / v2.0 / Azure. Так как портал использует их (если ваша AD поддерживает их), вам не повезло, что вы можете запустить функцию там.

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

После этого пришло осознание того, что вы не можете использовать MSAL, если пишете JS-клиент (в моем случае это Angular). Таким образом, одна альтернатива - ADAL, где реализация Angular выглядит несколько неловко. Поэтому я решил использовать angular-oauth2-oidc, который занял еще час, чтобы заставить его хорошо играть с Azure AD.

Но после всего этого я наконец могу получить доступ к своему API.

Я действительно не понимаю, почему вы не разрешаете пользователям получать доступ к функциональным приложениям Azure с помощью токенов Azure AD v2, но по крайней мере это должно быть гораздо лучше задокументировано. Но как бы то ни было, я, наконец, могу пойти спать.

РЕДАКТИРОВАТЬ: После того, как я открыл для этого проблему, они добавили примечание, что v2 не поддерживается функциями Azure, и, надеюсь, облегчит жизнь другим людям.

https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad

5 голосов
/ 22 марта 2019

Мне удалось заставить его работать через почтальона, используя следующую конфигурацию. Важным уроком было задание параметров «Разрешенные аудитории токенов», и имя «ресурса», используемое почтальоном для получения токена, в этом случае должно быть одинаковым. Я использовал тот же код, что и здесь. в этом случае приложение, зарегистрированное в Azure AD, является клиентом и ресурсом. настройка и тестирование через почтальона следующим образом

enter image description here

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

enter image description here

Вызов функции Azure с использованием Postman. Заголовок авторизации с токеном на предъявителя

enter image description here

1 голос
/ 19 марта 2019

Единственное, о чем я могу думать сейчас, это «Разрешенная аудитория».

Перейдите в настройки своего активного каталога и нажмите «Дополнительно».Под Разрешенный токен Аудитория Добавьте точный URL функции.Он может быть уже с URL-адресом обратного вызова, но просто замените его только на базовый URL-адрес функции без какого-либо обратного вызова, как указано на рисунке.

Убедитесь, что при нажатии ok вы также сохраните настройки аутентификации / авторизации, чтобы они вступили в силу, и повторите попытку через 1 минуту или около того.Я проверил, используя PostMan и передавая токен на предъявителя, и он работает!

enter image description here

1 голос
/ 18 марта 2019

В самом приложении AAD перейдите в Настройки -> Ответные URL-адреса и убедитесь, что URL-адрес приложения-функции находится в списке в следующем формате: https://mycoolapp.azurewebsites.net.Если это не так, добавьте его.

Если вы используете слоты, вы должны добавить его для обоих слотов.

0 голосов
/ 21 марта 2019

У меня сегодня точно такая же проблема. Проблема оказалась в идентификаторе ресурса, который я передавал при запросе токена доступа.

Например, изначально я запрашивал токен, подобный этому, используя URL-адрес функции в качестве идентификатора ресурса:

AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync("https://myfunction.azurewebsites.net", "myClientAppIdGUID", new Uri("https://login.live.com/oauth20_desktop.srf"), new PlatformParameters(PromptBehavior.SelectAccount)).Result;

Хотя это вернул токен доступа, я получил 401 несанкционированный при использовании токена доступа для вызова моей функции API.

Я изменил свой код, чтобы передать свой идентификатор приложения функций в качестве ресурса:

AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync("myFunctionAppIdGUID", "myClientAppIdGUID", new Uri("https://login.live.com/oauth20_desktop.srf"), new PlatformParameters(PromptBehavior.SelectAccount)).Result;

Теперь все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...