Использование файлов cookie для хранения сеанса в ASP MVC

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

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

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

Ответ 2

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

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

Ответ 3

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

Вот пример:

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

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

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

Ответ 4

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

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

Ответ 5

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

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);