Подтвердить что ты не робот

Cookie asp.net, аутентификация и тайм-ауты сеанса

У меня есть сайт asp.net, который использует проверку подлинности форм. Есть несколько вещей, которые я держу в сеансах, таких как имя пользователя, идентификатор пользователя, адрес электронной почты и т.д.

Я разрешаю пользователю оставаться на веб-сайте, установив длинную дату истечения срока действия cookie аутентификации. Таким образом, это очень часто для завершения сеанса, пока пользователь все еще аутентифицирован.

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

Какой лучший способ справиться с этим? Должен ли я повторно синхронизировать информацию о сеансе, когда информация больше не существует? Или я должен переместить информацию пользователя (имя пользователя, идентификатор пользователя, адрес электронной почты) в файлы cookie и не беспокоиться о тайм-аутах сеанса?

Я не хочу устанавливать длину сеанса примерно на 60 минут или более. Я хочу, чтобы мои пользователи могли войти в систему один раз и не беспокоиться о том, что вам нужно снова войти в систему, пока они явно не выйдут из системы.

4b9b3361

Ответ 1

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

Файлы cookie для проверки подлинности форм шифруются, и вы можете добавить дополнительные данные в эти файлы cookie (см. подробности ниже). Вероятно, он взломан, но не так легко, как простой файл cookie.

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

void AddUserIDToAuthCookie(string userID)  
{  
  //There is no way to directly set the userdata portion of a FormAuthenticationTicket  
  //without re-writing the login portion of the Login control  
  //  
  //I find it easier to pull the cookie that the Login control inserted out  
  //and create a new cookie with the userdata set  

  HttpCookie authCookie = Response.Cookies[AUTH_COOKIE];
  if(authCookie == null)
  {
    return;
  }

  Response.Cookies.Remove(AUTH_COOKIE);

  FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
  var newTicket =
    new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, oldTicket.Expiration,
                                  oldTicket.IsPersistent, userID, oldTicket.CookiePath);

  authCookie.Value = FormsAuthentication.Encrypt(newTicket);

  Response.Cookies.Add(authCookie);
}

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

Чтобы получить идентификатор на своей веб-странице...

FormsAuthenticationTicket ticket = ((FormsIdentity) Page.User.Identity).Ticket;
string id = ticket.UserData;

Я использовал этот механизм для хранения идентификатора, который не был частью пользовательских данных aspnetdb. Если все ваши данные идентификации обрабатываются aspnetdb, вам может потребоваться только доступ к объекту Page.User.Identity.

Ответ 2

Лично я бы сохранил 20-минутный дефолт и добавил функциональность "keep alive" на ваш сайт. Сделайте простой javascript, который опросит, скажите heartbeat.aspx, каждые 5 минут, чтобы сохранить сеанс в живых. Это продлит сеанс и аутентификацию, не сохраняя сумасшедших токенов аутентификации.

Есть несколько примеров (на мой взгляд, плохо), как это сделать. Я закончил тем, что использовал что-то, основанное на AjaxLines предотвращение таймаута сеанса. Однако вместо использования библиотеки ajax я просто использовал запрос xhtml напрямую. На самом деле ничего не нужно больше, чем приуроченный javascript-вызов к GET на странице heartbeat.

Ответ 3

Технически из-за тайм-аута сеанса asp.net ваш пользователь не должен выходить из системы. Это должно/должно управляться cookie аутентификации форм.

Вся необходимая информация, связанная с аутентификацией пользователя, должна храниться в свойстве USERDATA аутентификационного билета. Это значение не должно храниться в сеансе как сеанс.

Сохранять только это значение в сеансе.

Итак, когда вы создаете файлы cookie authetication, вы можете передать всю необходимую информацию как часть билета.

Быстрая вещь, которую вы можете сделать, это сохранить тайм-аут как проверки сеанса, так и форм. Это будет хорошей практикой.

Тайм-аут сеанса автоматически расширяется с каждым запросом на сайт.

В то время как аутентификация форм продлевает свое время только после того, как прошло 50% времени.

Вот подробная информация об этом. Часто задаваемые вопросы об аутентификации форм

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

Также сохраняйте тайм-аут как проверки сеанса, так и формы. Это будет хорошей практикой.

Тайм-аут сеанса автоматически расширяется с каждым запросом на сайт.

В то время как аутентификация форм продлевает свое время только после того, как прошло 50% времени.

Проще всего сделать это, чтобы продлить время аутентификации форм на пользовательской странице HttpModule или базовой странице, что бы вы ни делали.

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

Ответ 4

Не пробовав ничего сам, есть несколько вещей, которые я проверил.

  • Используйте метод/перегрузку класса FormsAuthentication, который позволяет вам установить постоянный файл cookie. Хотя, IMHO является общепринятым, позволяющим вашим пользователям выбирать, чтобы проверить "помнить меня", а не заставлять их постоянно регистрироваться. Существует несколько методов, которые позволяют вам делать это на основе того, какое поведение вы хотите - SetAuthenticationCookie() и RedirectFromLoginPage() - первые, которые приходят на ум.

  • Проверьте FormsAuthentication.GetAuthenticationCookie(). Это создаст HTTP файл cookie с токеном аутентификации, но на самом деле не установит его, что позволит вам изменить то, что вы хотите - хотя, если модуль FormsAuthentication ищет определенное значение, беспорядок с ним может нарушить аутентификацию. Затем вам придется добавить файл cookie в коллекцию файлов cookie в ответ вручную.

Ответ 5

Мой предпочтительный метод - использовать сеанс, подобный кешу. то есть попытайтесь прочитать из сеанса, если это значение там, тогда верните его, если оно нет, прочитайте его из хранилища сохраняемости (базы данных и т.д.), поместите его в сеанс и верните его.

Чтобы упростить это, создайте класс, добавьте свойство для каждой переменной в сеансе и сохраните экземпляр класса в сеансе. Затем создайте статический метод, чтобы получить экземпляр класса. Я добавлю пример позже, если смогу.