Проблема Cors при перенаправлении IdentityServer на redirect_uri

#ionic-framework #asp.net-identity #identityserver4

#ionic-framework #asp.net-идентификация #identityserver4

Вопрос:

Я работаю над веб-приложением SPA, состоящим из:

  • API, работающие на https://localhost:5001
  • IdentityServer4, работающий на https://localhost:5001
  • Мобильное приложение, клиент, использующий API, работающий на http://localhost:8100. Он основан на ionic capacitor и запущен с использованием ionic serve.

У меня возникли проблемы с завершением процесса входа с мобильного устройства. Что работает сейчас, так это то, что мобильное приложение вызывает сервер идентификации для авторизации, сервер идентификации проверяет пользователя, и результат должен вернуться обратно в мобильное приложение через перенаправление. Моя текущая проблема сейчас заключается в том, что я получаю проблемы с cors, когда сервер идентификации пытается перенаправить вызов в мобильное приложение.

У меня есть следующий поток:

  • Мобильное приложение вызывает конечную точку авторизации сервера идентификации, используя поток кода.
  • Сервер идентификации перенаправляет меня на страницу интерактивного входа.
  • Я ввожу адрес электронной почты / пароль и вызываю веб-api для аутентификации.
  • Вызов / авторизация / обратный вызов сервера идентификации с использованием токенов и учетных данных
  • Авторизация / обратный вызов должны перенаправить меня на redirect_uri мобильного приложения (http://localhost:8100/authcallback ), однако я получаю проблему CORS, как показано ниже, что может быть причиной проблемы?

Конечная точка входа в Api

        [HttpPost("login")] 
        public async Task<IActionResult> Login(UserResource model) { 
                   
            var result = await signInManager.PasswordSignInAsync(model.email, model.password, isPersistent: true, lockoutOnFailure: false);

            var context = await interaction.GetAuthorizationContextAsync(model.return_url);

            if (result.Succeeded) { 

                // @todo will need to be changed to support multiple organizations
                var uo = db.Users.Include(q => q.UserOrganization).Single( q => q.Email == model.email ).UserOrganization.First();
                uo.LastLogin = DateTime.UtcNow;
                await db.SaveChangesAsync();

                // let identity server know that we loggedin
                await identityEvents.RaiseAsync(new UserLoginSuccessEvent(
                     model.email, uo.UserId, model.email, clientId: context?.Client.ClientId
                ));


                return Redirect(model.return_url);
                /*return Ok( new{
                    email = model.email,
                    return_url = context.RedirectUri
                } );*/
            }

            // not including an empty object here raises an error, maybe a problem with core3-preview5
            await identityEvents.RaiseAsync(new UserLoginFailureEvent(model.email, "invalid credentials", clientId:context?.Client.ClientId));
            return NotFound(new {});

        }
  

введите описание изображения здесь

Ответ №1:

Проблема заключалась в том, что на самом деле я отправляю перенаправление с XMLHttpRequest на другой источник (http://localhost:8100 ), поэтому chrome не понравится, что выдает мне эту ошибку.

Исправление возвращало Ok () вместо Redirect () в контроллере входа, а в spa-клиенте javascript я выполняю перенаправление с помощью window.Расположение.