Проблема с аутентификацией токенов Azure AD в Web API - PullRequest
2 голосов
/ 03 июля 2019

У меня есть 2 веб-приложения.

  • Сайт A является как интерфейсным (угловым), так и веб-API, написанным в ядре .NET.
  • Сайт B - это веб-API, написанныйв ядре .NET.

Веб-API на обоих сайтах одинаковы.Аутентификация такая же.


Тест 1: Когда я прошу сайт А использовать свой собственный API для получения данных (с включенной аутентификацией сайта А), он отлично работает.

Тест 2: Когда я прошу Сайт A использовать Сайт B для получения данных (с отключенной аутентификацией Сайта B), он отлично работает.

Тест 3: Когда я прошу Сайт A использовать Сайт B для получения данных(с включенной аутентификацией сайта B) происходит сбой с неавторизованной ошибкой 401.

Вот код, который я использую для аутентификации ...

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
    o.MetadataAddress = String.Format("https://login.microsoftonline.com/{0}/v2.0/.well-known/openid-configuration", Configuration["AzureAd:TenantId"]);
    o.Audience = Configuration["AzureAd:ClientId"];
});

Итак ...

Я знаю, что токены проходят правильно (из-за теста A).

Я знаю, что вызываемый API сайта B доступен и корректен (из-за теста B).

Следовательно,Я предполагаю, что проблема связана со значениями, передаваемыми в Azure AD.Я предполагаю, что Azure не считает, что токены, полученные на сайте A и проверенные на сайте B (имеющие разные URI), не являются «одинаковыми» и, следовательно, не авторизованы.

Что мне нужно передать Azureзаставить его работать?

Спасибо

1 Ответ

1 голос
/ 03 июля 2019

В отношении токена произойдет 3 бита проверки

1) Будет подтверждено, что оно было подписано открытыми ключами поставщика открытого идентификатора (например, получено отсюда https://login.microsoftonline.com/common/discovery/keys)

).

2) Он проверит выдачу токена (заявка iss ) действительна для API

3) Будет проверена аудитория токена (утверждение aud ) действительно для API

(есть также дополнительная проверка срока службы, но эти 3 важны во время конфигурации)

Вероятно, токен, который вы отправляете в API, не проходит проверку эмитента или аудитории . Используйте JWT-декодер, такой как http://jwt.ms/, чтобы проверить токен и понять утверждения, которые отправляются в API.

Соответствует ли требование aud вашего токена аудитории, которую вы указываете в Конфигурации ["AzureAd: ClientId"]?

Если для обоих токенов используется один и тот же эмитент, и вы рады, что «Сайт B» принимает токены с «сайта А», то вы можете изменить параметры проверки токена, чтобы принимать несколько вариантов, посмотрите этот ответ на вопрос пример

https://stackoverflow.com/a/47072385/1538039

Изучите утверждения в токене, затем внесите изменения в конфигурацию сайта B, чтобы соответствующим образом подтвердить утверждения, предоставив аудитории / издателям, которым вы хотите, возможность общаться с ним.

...