Я пытаюсь реализовать функцию входа в систему "Запомнить меня" для создаваемого мной сайта ASP.NET MVC. Я пытаюсь использовать этот подход http://jaspan.com/improved_persistent_login_cookie_best_practice (см. «Дизайн Миллера» вверху) и заставить его работать до определенной степени.
Таким образом, рабочий процесс:
- Пользователь входит в систему и получает криптографически безопасную случайную строку + идентификатор своей базы данных в качестве постоянного файла cookie (продолжительностью около 30 дней). Защищенная строка хранится в базе данных рядом с записью их учетной записи пользователя.
- Позже пользователь возвращается на сайт, где браузер представляет файл cookie для входа, идентификатор и безопасный ключ ищутся в базе данных, и если совпадение найдено, пользователь автоматически аутентифицируется.
- После аутентификации генерируется новый безопасный ключ, сохраняется в базе данных и выдается новый файл cookie.
У меня это работает нормально, однако, оно не очень хорошо работает, если пользователь входит в систему с нескольких браузеров или компьютеров. Очевидно, что разные браузеры получат другой безопасный ключ, сохраненный в виде cookie, поэтому рабочий процесс становится следующим:
- Пользователь входит в браузер A, ему выдается безопасный ключ в виде cookie, ключ хранится в базе данных.
- Пользователь входит в систему из браузера B, ему выдается другой безопасный ключ, такой как cookie. Ключ также хранится в базе данных, но перезаписывает ключ, сгенерированный из браузера A.
- Пользователь снова заходит на сайт из браузера A, браузер снова представляет файл cookie, созданный на шаге 1., но он больше не совпадает, потому что безопасный ключ был заменен на шаге 2., поэтому пользователь должен снова войти в систему. Создается другой новый ключ, который перезаписывает ключ, выданный браузеру B.
- Пользователи снова заходят из браузера B, ключ не совпадает, должен войти снова и т. Д. И т. Д.
Как мне это решить? Нужно ли хранить и поддерживать несколько ключей в базе данных? Я даже иду об этом правильным путем? Я заметил, что StackOverflow, кажется, справляется с этим и запоминает меня из разных браузеров и компьютеров.