#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.Расположение.