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

StackOverflow https://stackoverflow.com/questions/1651364

  •  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top