Объединяя наше обсуждение здесь в качестве ответа.
Типичный подход к этому виду приложений заключается в том, что вы разрешаете неаутентифицированным клиентам загружать 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 является наиболее важной частью.