При использовании cookie-файла сеанса только для HTTP, как клиент узнает, когда истекает срок его сеанса? - PullRequest
0 голосов
/ 02 мая 2018

Мой веб-сайт - это AngularJS SPA с серверной частью Web API / SignalR, работающей на Owin. Управление аутентификацией осуществлялось с помощью веб-токена JSON (JWT), хранящегося в локальном хранилище браузера.

В соответствии с корпоративной директивой я перехожу с JWT в локальном хранилище на куки-файлы сеанса с одним сайтом только HTTP с скользящим сроком действия. Все отлично работает, кроме одной загвоздки:

Мое приложение отображает личную информацию о состоянии здоровья (PHI), поэтому я должен автоматически закрыть приложение, как только закончится сеанс. С JWT я мог бы проверить утверждение "exp", чтобы автоматически определить, что сеанс истек, и удалить PHI с экрана. Но с помощью HTTP-файла cookie я не могу получить доступ ни к какой части токена.

Когда я выдаю куки-файл, я знаю срок его действия и могу сообщить об этом браузеру. Однако, когда Оуэн обновляет cookie, браузер должен будет получить уведомление о новом истечении срока действия, и я не уверен, как это сделать.

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

Как сообщить браузеру, когда истекает срок сеанса, и обновлять браузер при изменении этого срока? Как я могу прикрепить обработчик событий к обновлению куки Оуэном?

Вот моя текущая конфигурация cookie:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    AuthenticationMode = AuthenticationMode.Active,
    CookieHttpOnly = true,
    ExpireTimeSpan = TimeSpan.FromHours(2),
    SlidingExpiration = true,
    CookieName = "Auth"                
});

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Довольно надежный и простой подход с HTTP делает endoint для этого и проверяет его, то есть раз в секунду:

module.run(($interval) = > {
  $interval(() => {
      $http.get('/checkToken').then((result) => {
        if (result.data.expired) {...}
      }, (error) => ...)
  }, 1000);
})

А на сервере в checkToken конечной точке вы можете делать все необходимые проверки.

Для лучшего взаимодействия клиент-сервер в реальном времени вы можете использовать сокеты, но это уже другая история.

0 голосов
/ 02 мая 2018

Я не очень хорошо знаком с Angular или Owin, но работаю с юридически защищенными данными об образовании, поэтому мы решаем их путем отсчета секунд, а затем сбрасываем обработчик после завершения вызова AJAX.

Голая версия выглядит примерно так:

var Countdown = {};
var Countdown.length = 3600 /* your session timeout here */;
var Countdown.seconds = Countdown.length;

var Countdown.tick = function() {
    Countdown.seconds--;
    if (Countdown.seconds == 0) {
         /* handle timeout */
    }
    /* any additional processing code here */
}

var Countdown.reset = function() { 
    Countdown.seconds = Countdown.length;
    /* any additional processing code here */
}

window.setInterval(Countdown.tick, 1000);
...