"Запомнить меня" Войти на сайт - Проблема с разными браузерами / компьютерами - PullRequest
3 голосов
/ 17 ноября 2010

Я пытаюсь реализовать функцию входа в систему "Запомнить меня" для создаваемого мной сайта ASP.NET MVC. Я пытаюсь использовать этот подход http://jaspan.com/improved_persistent_login_cookie_best_practice (см. «Дизайн Миллера» вверху) и заставить его работать до определенной степени.

Таким образом, рабочий процесс:

  1. Пользователь входит в систему и получает криптографически безопасную случайную строку + идентификатор своей базы данных в качестве постоянного файла cookie (продолжительностью около 30 дней). Защищенная строка хранится в базе данных рядом с записью их учетной записи пользователя.
  2. Позже пользователь возвращается на сайт, где браузер представляет файл cookie для входа, идентификатор и безопасный ключ ищутся в базе данных, и если совпадение найдено, пользователь автоматически аутентифицируется.
  3. После аутентификации генерируется новый безопасный ключ, сохраняется в базе данных и выдается новый файл cookie.

У меня это работает нормально, однако, оно не очень хорошо работает, если пользователь входит в систему с нескольких браузеров или компьютеров. Очевидно, что разные браузеры получат другой безопасный ключ, сохраненный в виде cookie, поэтому рабочий процесс становится следующим:

  1. Пользователь входит в браузер A, ему выдается безопасный ключ в виде cookie, ключ хранится в базе данных.
  2. Пользователь входит в систему из браузера B, ему выдается другой безопасный ключ, такой как cookie. Ключ также хранится в базе данных, но перезаписывает ключ, сгенерированный из браузера A.
  3. Пользователь снова заходит на сайт из браузера A, браузер снова представляет файл cookie, созданный на шаге 1., но он больше не совпадает, потому что безопасный ключ был заменен на шаге 2., поэтому пользователь должен снова войти в систему. Создается другой новый ключ, который перезаписывает ключ, выданный браузеру B.
  4. Пользователи снова заходят из браузера B, ключ не совпадает, должен войти снова и т. Д. И т. Д.

Как мне это решить? Нужно ли хранить и поддерживать несколько ключей в базе данных? Я даже иду об этом правильным путем? Я заметил, что StackOverflow, кажется, справляется с этим и запоминает меня из разных браузеров и компьютеров.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

После прочтения статьи, на которую вы ссылались, мне кажется, что дизайн Миллера состоит в том, чтобы хранить случайную строку и имя пользователя в виде пары в другой таблице, нежели таблица пользователя. Используя случайную строку в качестве индекса, вы можете иметь несколько одновременных входов в систему с одного и того же имени пользователя, в то же время оставаясь достаточно хорошо защищенными от перехвата сеанса.

Ваше описание указывает на то, что вы храните случайную строку внутри пользовательской таблицы, что позволит одновременно выполнять только один вход.

0 голосов
/ 06 июля 2012

Вам нужен третий элемент в вашем cookie, токен серии.Это будет представлять собой событие входа в систему.Каждый раз, когда пользователь входит в вашу систему, он создает новую серию, которая не меняется до тех пор, пока он не выйдет из системы или не войдет снова.У вас все еще есть свой токен, т.е. Защищенный ключ, который обновляется при каждом запросе.

Вот несколько ссылок, которые помогут с этой реализацией:

Проблемы с базой данных при разрешении нескольких постоянных входов браузера

Полное руководство по формеаутентификация на основе веб-сайтов

...