«аутентификация не удалась из-за: недопустимая аудитория jwt» с Azure AD - PullRequest
0 голосов
/ 11 апреля 2020

Сначала я опишу, как я настраиваю свои приложения, затем я опишу, как я использую API.

Настройка

  1. В моем Azure Активно Directory , у меня зарегистрировано два приложения: UI и Backend
  2. В UI есть идентификатор клиента clientId1, а в backend есть идентификатор клиента clientId2 (это GUID, но для простоты)
  3. Оба находятся под тот же арендатор tentant1 (один арендатор)

Backend (Web API)

  1. Backend имеет открытый API с областью действия «api: // clientId2 / access_as_user» и авторизованным клиентом "clientId1" с только что упомянутой областью действия
  2. Я использую passport и passport-azure-ad (я скопировал https://github.com/Azure-Samples/active-directory-javascript-nodejs-webapi-v2).
  3. Моя конфигурация:

    const config = {
        identityMetadata: "https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration",
        clientID: "clientId2",
        validateIssuer: false,
        loggingLevel: 'info',
        passReqToCallback: false,
        loggingNoPII: false
    };
    
  4. Я получаю это сообщение при запуске сервера:
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":40,"msg":"Production environments should always validate the issuer.","time":"2020-04-11T13:25:44.283Z","v":0}
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":30,"msg":"In BearerStrategy constructor: created strategy with options {\"identityMetadata\":\"https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration\",\"clientID\":\"clientId2\",\"validateIssuer\":false,\"loggingLevel\":\"info\",\"passReqToCallback\":false,\"loggingNoPII\":false,\"clockSkew\":300,\"allowMultiAudiencesInToken\":false,\"audience\":[\"clientId2\",\"spn:clientId2\"]\"isB2C\":false,\"_isCommonEndpoint\":false}","time":"2020-04-11T13:25:44.285Z","v":0}
Listening on port 5000

Пользовательский интерфейс (Angular SPA)

  1. Пользовательский интерфейс имеет разрешения, которым автоматически предоставляется разрешение на доступ к Microsoft Graph (профиль, user.read, user.read.all - последний, который, я думаю, я предоставил). Права доступа указаны в разделе «Права доступа API»
  2. Я продолжил работу и также предоставил доступ к Backend access_as_user
  3. Для кода пользовательского интерфейса я использую библиотеку MSAL и снова скопировал репозиторий. (https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-angular)
  4. В поле protectedResourceMap я добавил следующее
 ['https://graph.microsoft.com/v1.0/me', ['user.read']],
 ['http://localhost:5000', ['api://clientId2/access_as_user']],
Я могу войти в систему и прочитать свой профиль пользователя, но при попытке доступа к http://localhost: 5000 / hello (защищено) я получаю сообщение об ошибке в заголовке этого вопроса
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":20720,"level":30,"msg":"authentication failed due to: jwt audience is invalid","time":"2020-04-11T13:38:08.700Z","v":0}

-

Я вижу, что идет токен на предъявителя (в пользовательском интерфейсе и на сервере), сервер декодирует токен (я вижу все свои информация профиля в журналах сервера), но он говорит, что JWT недействителен ?!

Я не определяю аудиторию, но могу видеть в токене, когда она расшифровывается аудиторией с помощью aud: 'api://clientId2'.

Я также вижу, когда запускается бэкэнд, она показывает аудиторию как [clientId2, sps:clientId2] по умолчанию (шаг 4 на серверной части). Когда я определяю в конфигурации audience: 'api://clientId2', я получаю 403 с сообщением:

{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":12644,"level":30,"msg":"In Strategy.prototype.jwtVerify: We did not pass Req back to Callback","time":"2020-04-11T16:19:30.398Z","v":0}

Любая помощь будет оценена. Спасибо.

1 Ответ

1 голос
/ 12 апреля 2020

Оказывается, их код в хранилище не использует правильную конфигурацию для проверки доступа к области ...

https://github.com/Azure-Samples/active-directory-javascript-nodejs-webapi-v2/blob/master/index.js#L41

        if (req.authInfo['scp'].split(" ").indexOf("demo.read") >= 0) {

Мне нужно было измените область действия с "demo.read" на "access_as_user".

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