Использование куки для хранения сессии в ASP MVC - PullRequest
12 голосов
/ 30 октября 2009

Хранение всего сеанса в cookie-файлах было стандартным в Rails в течение последних нескольких лет - есть ли простой способ достичь чего-то похожего с ASP MVC?

По умолчанию все данные в Session / TempData хранятся в памяти на сервере. В web.config это может быть изменено на SQL Store / кэш на стороне сервера. Я бы хотел, чтобы эти объекты сохранялись в cookie.

Похоже, я мог бы реализовать собственный поставщик хранилища состояний сеансов. Есть ли более простой подход?

Ответы [ 6 ]

5 голосов
/ 10 ноября 2009

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

Кроме того, помните о безопасности: если файл cookie содержит информацию об аутентификации или другие конфиденциальные данные, и вы не будете осторожны, пользователь может легко взломать его, чтобы получить привилегии или иным образом испортить ваше приложение (шифрование данных - отстой потому что тогда вам нужно кодировать base-64 зашифрованные данные, что дополнительно тратит пропускную способность и время обработки). Вы должны никогда доверять вводу пользователя.

4 голосов
/ 10 ноября 2009

да, реализуем пользовательский поставщик сеанса в состоянии . И нет, на самом деле, нет более простого подхода.

Ps. это не так плохо, как кажется, т. е.> половина odbc образца записывает в БД.

2 голосов
/ 10 ноября 2009

Я бы настоятельно не рекомендовал хранить весь сеанс в куки. Это имеет плохие последствия для производительности. Учтите это: каждый запрос (к каждому ресурсу) будет содержать служебные данные, возможно, устаревших данных, которые вам нужны только один или два раза. В конечном итоге эти издержки коснутся ваших пользователей, вашей пропускной способности и производительности вашего сайта.

Вот пример:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

Начальный размер запроса составляет около 200 байтов. Допустим, вы добавляете около 100 байт к вашей сессии. Теперь размер составляет 300 байт, а накладные расходы составляют ~ 30%. Вы добавляете еще 100 байтов, а накладные расходы составляют 50%. Это означает, что примерно 2 раза требуется время для отправки запроса и 2 раза пропускная способность.

Вам лучше взглянуть на реализацию TempData на основе файлов cookie , так как она занимает гораздо меньше места и действительно имеет смысл.

0 голосов
/ 15 июня 2018

Я рекомендую хранить TempData в куки (в отличие от всего сеанса).

Чтобы сохранить TempData в файле cookie, вам необходимо переопределить ITempDataProvider и реализовать свой собственный пользовательский поставщик.

На самом деле доступен пакет nuget (который выполняет эту пользовательскую реализацию для вас): BrockAllen.CookieTempData и здесь есть документация . Преимущество этого пакета в том, что он сжимает и шифрует ваш TempData, поэтому вам не нужно беспокоиться об отправке простого текста через Интернет.

Все, что вам нужно сделать, это установить пакет nuget, а затем переопределить CreateTempDataProvider в вашем ControllerBase классе:

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}
0 голосов
/ 10 ноября 2009

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

Информация здесь; http://odetocode.com/articles/440.aspx

0 голосов
/ 30 октября 2009

зависит от того, какие данные вы хотите сохранить в куки, если вы хотите просто сохранить строку, подойдет следующий код:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...