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

ASP.NET MVC RememberMe

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

Я разрабатываю проект asp.net mvc. Я использую стандартные роли и членство в ASP.NET. Все работает нормально, но помните, что функциональность не работает вообще. Я перечисляю все детали работы. Надеюсь, вы, ребята, можете помочь мне решить эту проблему.

Мне просто нужно это:

Мне нужно, чтобы пользователь заходил в веб-приложение. Во время входа в систему они могут либо войти в систему, либо запомнить меня или без нее. Если пользователь входит в систему, помните меня, я хочу, чтобы браузер помнил их в течение длительного времени, пусть, по крайней мере, один год или значительно долгое время. Как они это делают на www.dotnetspider.com, www.codeproject.com, www.daniweb.com и многих других сайтах. Если пользователь входит в систему, не помни меня, браузер должен разрешить доступ к веб-сайту в течение примерно 20-30 минут, после чего срок их действия должен истечь. Их сеанс также должен истекать, когда пользователь входит в систему и отключает браузер без выхода из системы.

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

Либо есть какая-то ошибка со стандартными ролями asp.net и функциональностью членства, либо у меня есть целая концепция стандартных ролей и членства asp.net неправильно. я сказал, что хочу выше. Я считаю это очень простым и разумным.

Что я сделал

  • Форма входа с именем пользователя, паролем и именем меня.
  • Моя настройка в web.config:

    < аутентификационный режим = "Формы" >
    < forms loginUrl = "~/Account/LogOn" timeout = "2880" / >
    </аутентификации >

  • в My Control action, у меня есть это:

    FormsAuth.SignIn(имя_пользователя, помнитеMe);

    public void SignIn (строка userName, bool createPersistentCookie)  {  FormsAuthentication.SetAuthCookie(имя_пользователя, createPersistentCookie);  }

Теперь проблемы следующие:

Я уже говорил в предыдущем разделе "Мне просто нужно это". пользователь может успешно войти в систему. Их сеанс существует столько минут, сколько указано в тайм-ауте в web.config. Я также дал образец моего web.config. В моем образце, если я установил тайм-аут на 5 минут, пользовательский сеанс истекает через 5 минут, это нормально. Но если пользователь закрывает браузер и снова открывает браузер, пользователь все равно может войти на веб-сайт без входа в систему до тех пор, пока время, указанное в "тайм-ауте", не исчезнет. Скользящий срок действия для значения тайм-аута также отлично работает. Теперь, если пользователь регистрируется в системе, когда меня помнит, пользовательский сеанс по-прежнему истекает через 5 минут. Это не хорошее поведение, не так ли?. Я хочу сказать, что если пользователь входит в систему с помнящим меня, он должен быть запомнен в течение длительного времени, пока он не выйдет из системы, или пользователь не удалит все файлы cookie вручную из браузера. Если пользователь войдет в систему, не запомнив меня, его сеанс должен истечь после значений периода таймаута, указанных в файле web.config, а также если пользователи закрывают браузер. Проблема в том, что если пользователь закрывает браузер и снова открывает его, он все равно может войти на сайт без входа.

Я много ищу в Интернете по этой теме, но я не смог найти решение. В сообщении в блоге (http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx), сделанном Скоттом Гу по той же теме. Пользователи жалуются на то же самое в своих комментариях, нет простого решения, данное г-ном Скоттом.

Я читал его в следующих местах: http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14/91191.aspx

Я думаю, это проблема многих пользователей. Как видно из сообщения в блоге, сделанного г-ном Скоттом Гу.

Ваша помощь будет действительно оценена. Спасибо заранее.

4b9b3361

Ответ 1

То, что вы хотите сделать, - это другой тайм-аут, когда отмечен флажок RememberMe, чем когда он не установлен. К сожалению, метод SetAuthCookie не позволяет вам установить истечение вручную, поэтому вам придется сделать это самостоятельно.

Проблема в том, как это сделать?

ASP.NET MVC использует класс FormsAuthentication System.Web.Security для этого, потому что это не тривиально, если вы также хотите поддерживать настройки конфигурации и cookieless просмотра и SSL, но я думаю, что если вы просто это сделаете:

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days.
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line
cookie.HttpOnly = true; // cookie not available in javascript.
Response.Cookies.Add(cookie);

... вы получите базовую версию того, что вам нужно.

ПРИМЕЧАНИЕ. Я не тестировал этот код.

Ответ 2

Кевин и Дейв, ребята, рок, человек.

Дэйв, помимо вашего кода, мне пришлось добавить еще одну строку, чтобы она работала. Я хочу, чтобы он помнил хотя бы один год. Я должен был присвоить значение cookie.Используется в дополнение к вашему коду, чтобы он работал. Если эта строка cookie.Expires не установлена, cookie будет потерян после перезагрузки компьютера, я имею в виду в конце сеанса. Я заметил это в FireFox. Я просмотрел детали файла cookie, и я нашел: Если cookie.Expires не установлен, значение для атрибута "Истекает:" в Firefox равно "В конце сеанса", но если cookie.Expires установлен, значение "Expires:" атрибут в Firefox относится к дате времени. Значение cookie.Expires было установлено.

Вот код:

int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);            
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line
HttpContext.Current.Response.Cookies.Add(cookie);

Спасибо, ребята, это действительно отличное решение.

Ответ 3

Просто короткое замечание об использовании билета на членство в общедоступной среде для всех, кто может приземлиться здесь с этой проблемой. У меня есть сайт mvc runnig у godaddy и у меня проблемы с воспоминанием. Это было решение:

<system.web>
<machineKey
  validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953"
  decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291"
  validation="SHA1" decryption="AES"
/>

Благодаря: http://www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/

Ответ 4

Это не проблема, это особенность:)

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

Это истечение срока действия файла cookie, который делает недействительным сеанс пользователя.

Ответ 5

Я реализовал то же самое, и когда я тестирую его, он отлично работает в Mozila, но не работает в IE8 для всех ПК, я также обновил настройки для приема файлов cookie в IE, но все еще не работает.

Internet Explorer 8.x

  • Нажмите на меню "Сервис".
  • В меню выберите "Свойства обозревателя" - откроется новое окно.
  • Перейдите на вкладку "Конфиденциальность" в верхней части окна.
  • Нажмите кнопку "По умолчанию" в окне.
  • Переместите ползунок так, чтобы он находился на одном из уровней ниже среднего уровня (включая Medium, Low, Accept All Cookies).
  • Сохраните изменения, нажав OK.
  • Теперь вы сможете добавлять элементы в свою корзину покупок.