Получил токен JWT из Azure AD B2C, но получил ошибку 401 в приложении ASP.NET Core - PullRequest
0 голосов
/ 15 мая 2018

Я внедряю Azure AD B2C в новом приложении ASP.NET Core 2.1.

Я уже создал клиент Azure AD B2C и зарегистрировал свое приложение и т. Д.

ПослеЯ вхожу, меня перенаправляют на указанный мной URL-адрес, и я вижу токен в URL-адресе, но я получаю сообщение об ошибке, подтверждающее, что приложение требует аутентификации - см. Ниже: enter image description here

IЯ видел несколько похожих постов, и я понял, что токен автоматически проверяется промежуточным ПО.Разве это не так?

Что мне нужно сделать на этом этапе?

Код, который я включил в мое приложение, выглядит следующим образом:

В ConfigureServices() метод:

services.AddAuthentication(options => {
   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions => {
   jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
   jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
   jwtOptions.Events = new JwtBearerEvents
   {
       OnAuthenticationFailed = AuthenticationFailed
   };
});

В методе Configure() в Startup.cs все, что у меня есть, это app.UseAuthentication();

В моем контроллере я также использую [Authorize], чтобы убедиться, что мои действия выполняютсяне открыт для анонимных пользователей.

Что мне не хватает?Как проверить токен и получить претензии?

1 Ответ

0 голосов
/ 16 мая 2018

Объединяя наше обсуждение здесь в качестве ответа.

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

Тогдаинтерфейс может использовать MSAL.JS для аутентификации пользователя.Front-end SPA получит токен Id, который сообщает front-end, кто пользователь.MSAL.JS также позволяет вам получить токены доступа для вызова API.Для этого он использует скрытые фреймы + поток неявного предоставления.Затем этот токен доступа необходимо будет присоединить к запросам к API в качестве заголовка (Authorization: Bearer token-goes-here).

MSAL.JS будет использовать сеансовое или локальное хранилище для хранения токенов (это настраивается).Таким образом, в этой настройке файлы cookie не используются.

Тогда внутренний API должен аутентифицировать токен доступа, который он получает в заголовке.То, что у вас есть, уже достаточно для аутентификации токена.

services.AddAuthentication(options => {
   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions => {
   jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
   jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
   jwtOptions.Events = new JwtBearerEvents
   {
       OnAuthenticationFailed = AuthenticationFailed
   };
});

Обработчик аутентификации JWT Bearer загрузит документ метаданных OpenId Connect при запуске из настроенных здесь полномочий.Это позволяет ему помимо всего прочего получать открытые ключи подписи арендатора B2C.Эта информация позволяет обработчику проверять токены доступа по мере их поступления без какого-либо взаимодействия с B2C.Он проверяет, что подпись действительна, издатель действителен, и что аудитория в токене - это то, что было настроено.

Авторизация, конечно, не обрабатывается обработчиком аутентификации, поэтому вы должны также проверить, чтовызывающему пользователю фактически разрешен доступ к ресурсу, к которому он обращается.Идентификатор пользователя доступен в токене доступа.

MSAL.JS, возможно, также провел некоторую проверку токена (я не помню сейчас, если бы он сделал), но выполнял проверку во внешнем интерфейсе.это то, что может обойти любой, кто контролирует браузер пользователя.Проверка на стороне API является наиболее важной частью.

...