Невозможно проверить подпись маркера доступа, полученную из Azure AD, для защиты веб-API

Я пытаюсь защитить свой веб-API (.net core 2.2) с помощью Azure Ad, используя неявный поток.

Я зарегистрировал свое приложение в Azure AD, используя Портал Azure > Azure Active Directoy > Регистрация приложений > Регистрация нового приложения:

Имя = MyWebApi

Тип приложения = веб-приложение/API

URL-адрес для входа = http://локальный: 55000

После создания этого приложения я открыл его файл манифеста и изменил oauth2AllowImplicitFlow с ложный на истинный.

Это все, что я сделал для регистрации приложения на портале Azure.

Затем я вручную вызвал следующий URL-адрес из браузера Chrome, чтобы получить access_token:

https://login.microsoftonline.com/MY-AD-TENANT-GUID/oauth2/v2.0/authorize?client_id=MY-REGISTERED-APP-GUID&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%3A55000&scope=openid&response_mode= фрагмент

ответ от вызова вышеуказанного URL-адреса:

http://localhost:55000/#access_token=MY-ACCESS-TOKEN&token_type=Bearer&expires_in=3600&scope=profile+openid+email+00000003-0000-0000-c000-000000000000%2fUser.Read&session_state=b2be972a-6fbc-49f1

когда я передаю MY-ACCESS-TOKEN в качестве токена носителя в заголовке авторизации в свой веб-API (.net core 2.2), я получаю следующее исключение:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10511: Ошибка проверки подписи. Пробовали ключи: «Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: N-lC0n-9DALqwhuHYnHQ63GeCXc».

Затем я попытался вручную проверить подпись:

когда я вставляю MY-ACCESS-TOKEN в https://jwt.io/, заголовок:

{

  "typ": "JWT",

  "nonce": "AQABAAAAAACEfexXxjamQb3OeGQ4Gugvm6YdOT-bkA0IPllKMt06-J8If5AQ075TVCav94X_ZYcEYKaPneqdJcqYry-Z4XjX0eMN_fiJX_8wXe9D2b6eRiAA",

  "alg": "RS256",

  "x5t": "N-lC0n-9DALqwhuHYnHQ63GeCXc",

  "kid": "N-lC0n-9DALqwhuHYnHQ63GeCXc"

}

Затем я перешел по этому URL-адресу, чтобы получить открытый ключ для ребенка: N-lC0n-9DALqwhuHYnHQ63GeCXc.

https://login.microsoftonline.com/common/discovery/keys

Затем я вставил следующее в качестве открытого ключа на jwt.io для проверенной подписи токена:

-----BEGIN CERTIFICATE-----

OBTAINED-PUBLIC-KEY-FROM-THE-ABOVE-URL-HERE

-----END CERTIFICATE-----

и я снова получаю Неверная подпись.

Я был в этой теме: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609, но я не уверен, почему заголовок моего токена имеет значение одноразовый номер и является ли это проблемой вообще в моем случае или нет.

Любые идеи, что я делаю неправильно здесь?

Я вижу, что токен доступа, который вы возвращаете, также включает в себя область для Microsoft Graph API. Я думаю, что это причина того, что Nonce также появляется. чтобы проверить его.. в частности, 00000003-0000-0000-c000-000000000000/User.Read область.. где 00000003-0000-0000-c000-000000000000 — идентификатор ресурса для Microsoft Graph API..

Rohit Saigal 19.03.2019 19:10

Любые идеи, почему я получаю возможности для Microsoft Graph? Я не просил его в своем запросе.

M. Ali Iftikhar 19.03.2019 19:19

На мой взгляд, вам следует изменить свое приложение, чтобы получить токен доступа для вашего API. Поскольку на данный момент вы не указываете, для какого API вы хотите. Вы можете зарегистрировать API как приложение, определить для него разрешения OAuth и назначить разрешения внешнему приложению, получающему токен.

juunas 19.03.2019 19:29

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

M. Ali Iftikhar 19.03.2019 20:38

Приятно видеть, что вы уже четко определились с регистрацией API и окончательным планом, как вы говорите. Еще одна вещь, на которую следует обратить внимание. Вы зарегистрировали приложение на обычном портале Azure (поэтому оно будет принимать токены v1 по умолчанию).. но вы работаете с конечной точкой v2 для получения токена... и поскольку вы не указываете, какой API вы хотите токен для, конечная точка возвращает вам токен для всех разрешений, которые были статически определены во время регистрации вашего приложения. Я думаю, что в настоящее время при регистрации вашего приложения может быть выбрано Microsoft Graph с User.Read в соответствии с требуемыми разрешениями.

Rohit Saigal 19.03.2019 21:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
4 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я попробовал это на своей стороне, это сработало хорошо.

URL-адрес запроса:

https://login.microsoftonline.com/tenant-name/oauth2/v2.0/authorize?client_id=application_id&response_type=token&redirect_uri=https://snv2app.azurewebsites.net&scope=api://f3d966c0-517e-4e13-a5bb-9777a916b1a0/User.read openid&response_mode=fragment

И когда я получил access_token, я разобрал его в jwt.io и ввел публичный ключ, я получил результат:

Что такое api://f3d966c0-517e-4e13-a5bb-9777a916b1a0/User.read в области видимости?

M. Ali Iftikhar 20.03.2019 11:56
api://f3d966c0-517e-4e13-a5bb-9777a916b1a0 — это мой API и соответствующие разрешения.
SunnySun 21.03.2019 02:50

это действительно было проблемой, моя область не содержала URI API, передача которого в область не возвращала значение nonce, и поэтому я смог проверить подпись. Спасибо за вашу помощь.

M. Ali Iftikhar 22.03.2019 10:57

Здесь происходит токен, который вы получаете, это access_token для конечной точки userInfo. Аудитория граф. Токены для графа были изменены особым образом, так что они должны быть преобразованы, прежде чем подпись может быть проверена. Это позволяет графу пересылать токен вниз по течению (после преобразования) и не беспокоиться о переадресации атаки.

Чтобы проверить, посмотрите, есть ли «aud == graph».

У меня была такая же проблема, я использовал токен доступа, чтобы проверить его с помощью сайта JWT.io, но это не удалось, и ваш комментарий помог мне увидеть, могу ли я проверить idToken, и он был проверен! Но есть идеи, как проверить токен доступа? Я использую библиотеку MSAL.js, и для получения маркера доступа вызывается методAcquireTokenSilent с параметром областей графа. Итак, есть ли способ проверить этот токен доступа к графу?

Maverick 20.05.2019 13:20

@Maverick, что вы хотите проверить о токене? Graph проверит токен при получении.

Brent Schmaltz 20.05.2019 18:11

Я хочу получить роли пользователей и группы, к которым они принадлежат, например

Maverick 21.05.2019 08:28

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

Brent Schmaltz 21.05.2019 22:48

Другие вопросы по теме