.NET Session - Сохранять сеанс, даже когда пользователь закрывает браузер - PullRequest
4 голосов
/ 22 марта 2012

Мы используем .net Framework 3.5 и C #.

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

Затем мы вызываем FormsAuthentication.SetAuthCookie () , так что пользователь, которого мы войдем в мое приложение.

И на всех последующих страницах,мы проверяем с помощью User.Identity.IsAuthenticated () , вошел ли пользователь в систему.

Мы хотим сохранить этот сеанс, даже когда пользователь закрывает окно просмотра.

Как лучший способ сделать это?

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

(извините за мой английский ..... говорящий на португальском языке)

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

Вы не должны смешивать термины, помните, что у вас есть как файл cookie аутентификации, так и состояние сеанса в asp.net.

Вы, похоже, ищете постоянный файл cookie аутентификации.чтобы иметь постоянный файл cookie авторизации, попробуйте

FormsAuthentication.SetAuthCookie("xxx",true); 

http://msdn.microsoft.com/en-us/library/twk5762b(v=vs.90).aspx

, передав значение true, чтобы файл cookie аутентификации выжил после перезапуска браузера.также вы должны учитывать значения времени ожидания для аутентификации форм и сеанса в вашем файле web.config

<authentication mode="Forms">
        <!-- The name, protection, and path attributes must match 
       exactly in each Web.config file. -->
        <forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" protection="All" path="/" timeout="360"/>
    </authentication>

<sessionState mode="InProc" timeout="360" />
1 голос
/ 22 марта 2012

Я бы предложил более чистый подход к хранению информации о сеансе. Конечно, подход Shay к сохранению файла cookie аутентификации правильный , но хранение sessionState в процессе в течение длительного времени имеет серьезные недостатки при масштабировании приложения для нескольких одновременно работающих пользователей.

Во-первых, для пояснения, состояние сеанса означает буквально все, к чему вы можете получить доступ через Session[] collection.

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

В основном вам нужно

  1. Таблица, которая primary и foreign связана с идентификатором пользователя, с а) таким количеством столбцов, сколько переменных необходимо сохранить, или б) одним единственным BLOB-столбцом, содержащим сериализованное значение класса
  2. A PersistentSession класс
  3. Заполните этот объект в методе Global.asax Session_Start или лучше Application_PostAuthenticateRequest и сохраните его в Session object
  4. Сохранить объект из Session в БД в Global.asax Session_End, метод

Если вы выбрали подход B, просто сериализовать / десериализовать объект, и вы его получили!

* Реальный способ использования этих парней SAVESESSION совершенно другой

...