2012-01-17 3 views
5

Мне нужно сохранить некоторые связанные с сеансом данные для пользователя. Эти данные не нужно зашифровывать, но я хочу, чтобы пользователь не мог его модифицировать. Я думаю, что мои настройки состоят в том, чтобы сохранить его в скрытом поле, сохранить его в файл cookie или сохранить в состоянии сеанса ASP.Net. Мне нужно, чтобы решение было безопасным сервером.Информация о сеансе хранения в ASP.Net Cookie или состоянии сеанса?

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

Как вы думаете, лучший подход для данных такого типа?

ответ

5

Первый вопрос Я спрашиваю себя о данных сеанса: мне они действительно нужны? Помните, что веб-сайт является апатридом, поэтому, возможно, вы можете повторно настроить приложение, чтобы не использовать состояние сеанса. Сессии требуют большого количества ресурсов управления и сервера.

Тем временем у вас есть два решения:

  • потому, что вы находитесь в ферме поставить сеанс на SQL Server настройки состояния сеанса в web.config (это требует ресурсов, и это немного медленнее, но это самый безопасный способ для хранения данных сессии для обеспечения пользователь не может изменить его)

  • добавить механизм шифрования/дешифрования для вашего печенья с собственным сервером ключа

+2

Я согласен с тем, что первый вопрос должен быть - действительно ли мне нужно это делать так? Помимо хранения информации об аутентификации, вы должны действительно стремиться к тому, чтобы быть как можно более безгражданством. –

+0

Хороший ответ. Альтернативой является кеш скорости AppFabric для хранения состояния - см. Мой ответ ниже. –

2

Лично я считаю, что лучше хранить информацию в cache, хотя вполне можно хранить в session или зашифровать его и хранить его в cookie и это просто вопрос личных предпочтений

Причина, по которой я предпочитаю, cache заключается в том, что он не уязвим для захвата сеанса, поэтому нет возможности изменить его, поскольку он хранится на сервере (то же, что и session).

Я задал вопрос об использовании пользовательского принципала, и я включил в него довольно много кода, который может вам помочь.

Код для хранения дополнительных сведений о пользователе в кэше:Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?

EDIT: И поэтому я предпочитаю хранить эту информацию где-то под рукой, что я не хочу, чтобы Кеп колючий от до базы данных все время, так как это очень неэффективно.

4

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

Состояние сеанса ASP.NET является приемлемым решением для вашей проблемы, хотя есть некоторые оговорки в отношении серверных ферм. В этом MSDN article объясняется, как заставить Session State работать в среде фермы серверов. Ответ Be.Start затрагивает предлагаемый внепроцессный подход.

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

1

Если вам нужно использовать ферму и хотите разделить состояние сеанса между узлами, не возвращаясь в базу данных все время, вы можете использовать AppFabric Session Provider. Существует немного кривой обучения, которая настраивает его, но он выполняет эту работу и работает быстро (не запускайте ее в том же поле, что и ваше приложение).

Смежные вопросы