NikFaraday
@NikFaraday
Student full-stack Developer

Как удалить сессию из БД после истечения срока?

Здравствуйте!

Пытаюсь реализовать схему авторизации на основе сессий. По ТЗ их нужно хранить в БД, но я не совсем разобрался с этой темой и механизмами работы с этим, по этому могу быть где-то не прав.

Вопрос состоит в том, что после истечения срока жизни сессии или во время не активности её нужно удалить из базы данных. Меня интересует сам механизм определения, когда это нужно делать и как. При авторизации всё понятно (более-менее), т.е. есть некоторое событие во время которого создаётся сессия, заносится в БД, а её Id закидывается в session-storage.

Для обновления времени активности так же понятно, т.к. нужно просто поставить middle-war'у, которая будет брать id из session-storage, по нему искать эту сессию в БД (сначала в кэше) и делать обновления данных.

Но не совсем понял механизм, как сделать sign-out при не активности или полном истечении времени сессии. Единственное что приходит в голову это background tasks, но думаю, что есть более нормальные решения этой проблемы.
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
В ASP.NET Core есть стандартный механизм сеансов (ISession): https://learn.microsoft.com/aspnet/core/fundamenta...
Работает он на базе распределенного кэша (IDistributedCache), который штатными средствами можно базировать на MS SQL и на Redis (и, возможно, есть дополнительные сторонние пакеты для базирования на других СУБД,). Идентифкатор сессии хранится в куки (настраеваемой), по умолчанию - HTTP-only (но это настраивается).
Механизм устаревания сеансов там есть, параметры тоже можно настроить.
Кароче, если нет причин обязательно делать свой велосипед (типа, для учебной задачи) можно использовать этот стандартный механизм.
Правда идея использовать этот механизм именно для авторизации у меня вызывает некоторые неясные опасения: он, вообще-то, не для того сделан. А именно для авторизации (плюс аутентифкация) в ASP.NET Core тоже есть штатное решение (Identity и политики авторизации). И вообще, аутентифкация/авторизация - это такое место, где легко накосячить, а потому лучше там обходиться без своих велосипедов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
1. Можно сессии хранить в чём-то типа редиса - там можно задавать ttl
2. При хранении в обычной реляционке - можно на всякие события аутентификации, когда ты читаешь таблицу сессий - смотреть на ttl и удалять просроченные.
3. Сверху ещё добавляем какую-нибудь задачу в cron, которая будет раз в сутки чистить.

Но не совсем понял механизм, как сделать sign-out при не активности или полном истечении времени сессии. Единственное что приходит в голову это background tasks, но думаю, что есть более нормальные решения этой проблемы.

Не обязательно удалять сессию сразу после её истечения - всё равно же при запросах проверяешь время действия.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы