Использование файлов cookie для хранения сеанса в ASP MVC
-
22-07-2019 - |
Вопрос
Сохранение всего сеанса в файле cookie было стандартным в Rails в течение последних нескольких лет - есть ли простой способ добиться чего-то подобного с ASP MVC?
По умолчанию все, что содержится в Session / TempData, хранится в памяти на сервере.В web.config это может быть изменено на хранилище SQL / серверный кэш.Я бы хотел, чтобы эти объекты сохранялись в файле cookie.
Похоже, я мог бы реализовать пользовательский поставщик хранилища состояний сеанса.Есть ли более простой подход?
Решение
да, внедрите пользовательское состояние сеанса-провайдера.И нет, afaik, более простого подхода не существует.
Ps.это не так плохо, как кажется, т.е.> половина всего пример odbc выполняет запись в базу данных.
Другие советы
Я думаю, что было бы намного эффективнее просто сохранить идентификатор сеанса (хеш или что-то еще) в файле cookie, а затем использовать этот идентификатор для получения данных сеанса из памяти / базы данных / любого хранилища, которое вы предпочитаете. Сохранение полного состояния сеанса в файле cookie увеличивает пропускную способность без необходимости. Р>
Кроме того, помните о безопасности: если файл cookie содержит информацию об аутентификации или другие конфиденциальные данные и вы неосторожны, пользователь может легко взломать его, чтобы получить привилегии или иным образом связываться с вашим приложением (шифрование данных - отстой потому что тогда вам нужно кодировать base-64 зашифрованные данные, что дополнительно тратит пропускную способность и время обработки). Вы не должны никогда доверять вводу пользователя.
Я бы настоятельно не рекомендовал хранить весь сеанс в файлах cookie. Это имеет плохие последствия для производительности. Учтите это: каждый запрос (к каждому ресурсу) будет содержать служебные данные, возможно, устаревших данных, которые вам нужны только один или два раза. В конечном итоге эти издержки затронут ваших пользователей, пропускную способность и производительность вашего сайта.
Вот пример:
GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...
Начальный размер запроса составляет около 200 байтов. Допустим, вы добавляете около 100 байт к вашей сессии. Теперь размер составляет 300 байт, а накладные расходы составляют ~ 30%. Вы добавляете еще 100 байтов, а накладные расходы составляют 50%. Это означает, что примерно 2 раза требуется время для отправки запроса и 2 раза пропускная способность.
Вам лучше заглянуть в реализация TempData на основе файлов cookie , поскольку она занимает гораздо меньше места и действительно имеет смысл.
Я рекомендую хранить TempData
в файле cookie (в отличие от всего сеанса).
Для того, чтобы хранить TempData
в файле cookie вам нужно переопределить ITempDataProvider
и внедрите свой собственный пользовательский провайдер.
На самом деле доступен пакет nuget (который выполняет эту пользовательскую реализацию за вас).: Брокаллен.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();
}
}
}
Вы не должны использовать сеансы для этого, а вместо этого профили. Профили используют файлы cookie для сопоставления компьютеров с профилями и т. Д. Ключ профиля хранится в файле cookie и не теряется при закрытии браузера и т. Д.
Информация здесь; http://odetocode.com/articles/440.aspx
зависит от того, какие данные вы хотите сохранить в куки, если вы хотите просто сохранить строку, подойдет следующий код:
HttpCookie cookie = new HttpCookie("username","sth");
cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(cookie);