Необходимо, чтобы если у пользователя изменилось имя, email или пароль произошел выход со всех других устройств. По умолчанию авторизация сохраняется, даже если старая комбинация логина и пароля в бд отсутствует. Используется ASP.NET Core Identity
Сделал костыль с сохранением токинов в базе данных и их проверкой при каждом запросе к не статическим ресурсам. При смене пароля или email все сохраненные токины удаляются из бд. Я уверен, что в ASP.NET Core Identity должен быть какой-то более простой способ для сброса авторизаций.
Ответ
Сначала кратко опишу терминологию, чтобы не путаться в дальнейшем. В стандарте OAuth2 клиенты получают у сервера авторизации токен доступа (access token) и передают его владельцу ресурса в каждом запросе. Передавать токен можно в куках либо в заголовке HTTP, последний способ аутентификации называется Bearer. Сам токен является зашифрованной или по меньшей мере подписанной информацией о пользователе. Часто для подписания и шифровки используют стандарт JWT, тогда данные хранятся в виде json-объекта.
У токена доступа есть время жизни. Дата/время завершения токена хранится непосредственно в нём, поэтому сервер может вычислить, жив токен или нет.
Проблематика
Такая схема не позволяет деаутентифицировать клиентов при наступлении определённых условий, потому что пока время жизни не истекло, владелец ресурса считает токен валидным.
Решение
Чтобы можно было сделать токены невалидными, владелец ресурса должен складывать их в кеш memcached или Redis. Тогда проверка токена будет проходить в два этапа: сначала мы должны убедиться, что токен есть в кеше, а потом проверить время его жизни. При несоблюдении любого из этих условий токен считается невалидным.
Соответственно, при смене пароля надо удалить из кеша все токены доступа данного пользователя. Если помимо токенов доступа вы реализовали токены обновления (refresh tokens), их также надо хранить в кеше, и также надо удалять.
Конкретика
Этот механизм может быть реализован разными способами. Вот статья на MSDN, описывающая, как могут быть кешированы токены доступа в ASP.NET Core.
Комментариев нет:
Отправить комментарий