Как настроить аутентификацию OpenID 2.0 с помощью SPA и API? - PullRequest
0 голосов
/ 23 апреля 2020

Проблема


У меня есть 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
    }
...