Проблема
В стеке, которое мы повторно используем между проектами, мы помещаем немного слишком много данных в сеанс для передачи данных между страницами. Это было хорошо в теории, потому что оно предотвращает подделку, повторные атаки и т.д., Но создает столько проблем, сколько решает.
Потеря сеанса сама по себе является проблемой, хотя в основном она обрабатывается приложением Session State Server (или с использованием SQL Server). Что еще более важно, сложно сделать обратную кнопку работать правильно, а также сделать дополнительную работу, чтобы создать ситуацию, когда пользователь может, скажем, открыть один и тот же экран на трех вкладках, чтобы работать с разными записями.
И это только верхушка айсберга.
У большинства из этих проблем есть обходные пути, но, как я отмахиваюсь, все это трение дает мне ощущение, что передача данных между страницами с использованием сеанса является неправильным направлением.
То, что я действительно хочу здесь сделать, - это передовой опыт, который мой магазин может использовать все время для передачи данных между страницами, а затем для новых приложений заменять ключевые части нашего стека, которые в настоящее время полагаются на Session.
Было бы неплохо, если бы окончательное решение не привело к горам кода сантехники.
Предлагаемые решения
Session
Как уже упоминалось выше, тяжелая атака на сессию кажется хорошей идеей, но она прерывает кнопку "Назад" и вызывает некоторые другие проблемы.
Там могут быть способы обойти все проблемы, но это кажется большим количеством дополнительной работы.
Одна вещь, очень приятная в использовании сеанса, заключается в том, что подделка - это просто не проблема. По сравнению с передачей всего через незашифрованный QueryString, вы в конечном итоге пишете гораздо меньше защитного кода.
Отправка перекрестных страниц
По правде говоря, я почти не рассматривал этот вариант. У меня возникла проблема с тем, насколько сильно он связан с страницами - если я начинаю делать Prep.FindControl( "SomeTextBox" ), это похоже на проблему обслуживания, если я когда-либо захочу перейти на эту страницу с другой страницы, которая, возможно, не имеет элемент управления SomeTextBox.
Он кажется ограниченным и другими способами. Возможно, я хочу попасть на страницу по ссылке, например.
QueryString
В настоящее время я склоняюсь к этой стратегии, как в старые времена. Но я, вероятно, хочу, чтобы моя QueryString была зашифрована, чтобы затруднить ее вмешательство, и я также хотел бы справиться с проблемой повторных атак.
На 4 парня из Rolla, есть статья об этом.
Тем не менее, должно быть возможно создать HttpModule, который позаботится обо всем этом, и удалит все шифрование сосисок со страницы. Разумеется, У Мэдс Кристенсена есть статья, в которой он выпустил один. Однако комментарии звучат так, будто у него проблемы с чрезвычайно распространенными сценариями.
Другие параметры
Конечно, это не exaustive взгляд на варианты, а скорее основные варианты, которые я рассматриваю. Эта ссылка содержит более полный список. Те, которые я не упомянул, такие как Cookies и Cache, не подходят для передачи данных между страницами.
В закрытии...
Итак, как вы справляетесь с проблемой передачи данных между страницами? Какие скрытые искатели вам приходилось работать, и есть ли какие-либо ранее существовавшие инструменты вокруг этого, которые решают их все безупречно? Считаете ли вы, что у вас есть решение, которым вы полностью довольны?
Спасибо заранее!
Обновление: На всякий случай, когда я не достаточно ясен, "передавая данные между страницами", о которых я говорю, например, передавая ключ CustomerID с страницы CustomerSearch.aspx, чтобы Client.aspx, где Клиент будет открыт и может быть изменен.