Сохранение состояния входа в систему при обновлении с использованием файлов cookie в Angular 4 + ASP.NET Core Identity - PullRequest
0 голосов
/ 29 июня 2018

Я начал с отслеживания состояния входа в систему с помощью флага isLoggedIn в службе аутентификации, которую я написал, и он установлен на true, когда пользователь успешно проходит аутентификацию на сервере с Identity.

Теперь я хочу, чтобы они вошли в систему, чтобы им не всегда приходилось входить при обновлении страницы. Я добавил эту функцию в службу аутентификации:

testLogin() : Observable<boolean> {
return this.httpClient.post("/api/Account/TestLogin", null, { observe: "response" })
  .map(result => {
    if (result.ok) {
      this.isLoggedIn = true;
    }

    return this.isLoggedIn;
  });
}

И это для моего бэкэнда (контроллер находится за атрибутом [Authorize]):

    [HttpPost("[action]")]
    public IActionResult TestLogin()
    {
        return Ok();
    }

Я проверяю это при запуске моего приложения, в app.component.ts:

constructor(private authService: AuthenticationService) {
  authService.testLogin().subscribe(result => {});
}

Проблема в том, что мой охранник маршрута canActivate возвращает true, если флаг isLoggedIn имеет значение true, в противном случае перенаправляется на страницу входа и возвращает false. Это происходит до того, как запрос функции testLogin завершен, поэтому меня перенаправляют на вход в систему, несмотря на то, что я успешно прошел проверку подлинности, я могу перемещаться по странице со страницы входа в систему без входа в систему. Это неправильный способ сделать это? Я просто использую стандартную настройку ASP.NET Core Identity с файлами cookie, но большинство руководств, которые я нашел по этому вопросу, используют JWT, который я не использую.

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, вам нужен сервис для хранения вашего статуса isLoggedIn.

. При запуске приложения установите loginService.isLoggedIn = false;

. В компоненте входа в систему и если вход в систему в порядке, установите loginService.isLoggedIn = true;

затем используйте роутер для навигации router.navigate (['home']);

. В authGuard проверьте значение loginService.isLoggedIn.

Вы также можете использовать функцию в вашем сервисе для установки / получения значения isLoggedIn (которое в этом случае будет приватным для сервиса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...