ASP.NET MVC RememberMe - PullRequest
       18

ASP.NET MVC RememberMe

12 голосов
/ 16 марта 2010

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

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

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

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

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

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

Что я сделал

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





  3. в действии Мой контроллер, у меня есть это:

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

    public void SignIn (строка userName, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie (userName, 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

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

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

Ответы [ 5 ]

26 голосов
/ 16 марта 2010

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

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

ASP.NET MVC использует для этого класс FormsAuthentication класса System.Web.Security, поскольку нетривиально, если вы также хотите поддерживать параметры конфигурации и просмотр без cookie и 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);

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

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

4 голосов
/ 04 июля 2010

Просто краткое замечание об использовании членского билета авторизации в общей среде для всех, кто может попасть сюда с этой проблемой. У меня есть сайт Mvc, работающий в 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 голосов
/ 16 марта 2010

Кевин и Дейв, ребята, вы молодцы.

Дейв, в дополнение к вашему коду мне пришлось добавить еще одну строку, чтобы она заработала. Я хочу, чтобы это запомнилось как минимум на один год. Мне пришлось присвоить значение cookie.Expires в дополнение к вашему коду, чтобы он работал. Если эта строка cookie не установлена, файл cookie теряется после перезагрузки компьютера, я имею в виду в конце сеанса. Я заметил это в FireFox. Я просмотрел детали cookie и обнаружил: если cookie.Expires не установлен, тогда значение для атрибута «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);

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

1 голос
/ 16 марта 2010

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

Сеанс пользователя еще не истек, поэтому, даже если он закроет и снова откроет браузер, файл cookie все еще в порядке.

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

0 голосов
/ 28 июня 2010

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

Internet Explorer 8.x

  1. Нажмите на Сервис-меню.
  2. Выберите Свойства обозревателя в меню - откроется новое окно.
  3. Нажмите на вкладку Конфиденциальность в верхней части окна.
  4. Нажмите на кнопку по умолчанию окна.
  5. Переместите ползунок так, чтобы он находился на одном из уровней ниже Средне высокого (включая Среднее, Низкое, Принять все файлы cookie).
  6. Сохраните изменения, нажав ОК.
  7. Теперь вы сможете добавлять товары в корзину.
...