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

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

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

Имя = MyWebApi

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

URL для входа = http://localhost:55000

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

Это все, что я сделал для регистрации приложения на портале 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=fragment

ответ на вызов вышеуказанного 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-cfbc-49f1-bfc0-6c93f6c87d02

когда я передаю 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,, но я не уверен, почему мой заголовок токена имеет значение nonce или это вообще проблема в моем случае или нет.

Есть идеи, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

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

Запрос 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 и вошел воткрытый ключ, я получил результат:

enter image description here

1 голос
/ 17 апреля 2019

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

Для проверки см. 'Aud == graph'.

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