Проблема
У меня есть SPA (реагирует) с API (. Net Core), который я хочу аутентифицировать с использованием (IdP) Identity Provider, который поддерживает только OpenId 2.0. Мне бы хотелось, чтобы эта аутентификация работала и для API.
Мне удалось реализовать аутентификацию с IdP, чтобы я получил от них обратный вызов с информацией о пользователе, и я реализовал basi c Аутентификация JWT между SPA и API.
Однако я не понимаю, как их можно соединить, поскольку в JWT не указано SignIn' method, but OpenId 2.0 demands that a
SignInScheme`.
Текущий Процесс аутентификации выглядит следующим образом: SPA -> Перенаправляет на API -> API перенаправляет на IdP -> Пользователь вводит свои учетные данные -> IdP перенаправляет на API -> API аутентифицирует пользователя -> API Перенаправляет пользователя на SPA с поваром ie содержащий токен JWT -> SPA извлекает и сохраняет токен JWT -> SPA отправляет токен JWT при каждом запросе.
Что я пробовал
Если я пытаюсь использовать JWT в качестве DefaultSignInScheme
, но тогда я получаю следующую ошибку
Аутентификация Обработчик, зарегистрированный для схемы 'Bearer', - это 'JwtBearerHandler', который нельзя использовать для SignInAsyn c
Я пытался использовать файлы cookie в качестве DefaultSignInScheme
и JWT в качестве DefaultAuthenticatioScheme
и DefaultChallengeScheme
. Тем не менее, мне кажется, что это неправильно, так как в моем API есть повар ie, и очистка данных SPA не выводит меня из системы. Я мог бы обойти это, проверив, отправляю ли я токен JWT, но опять-таки это кажется хакерским.
Я пытался передать повара ie обратно в SPA, прежде чем он будет установлен в API; однако, повар ie настроен на API, прежде чем я смогу с ним взаимодействовать
Фрагменты кода
Startup.cs with the JWT and Cookie flow
private void ConfigureAuthentication(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["AuthenticationSettings:Secret"])),
ValidateIssuer = false,
ValidateAudience = false
};
})
.AddCookie(options =>
{
options.Cookie.Name = Constants.Authentication.Cookies.AuthCookie;
options.Cookie.HttpOnly = true;
options.Cookie.SameSite = SameSiteMode.None;
})
.AddSteam(); // The OpenId 2.0 IdP
}