Просмотр сеансов и вкладок ASP.Net MVC

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

Кто-нибудь знает метод, который позволяет делать закладки без кражи сеанса (без файлов cookie) (и это не работает в MVC2 для аннотаций данных).

Поддержка вкладок таким образом, чтобы они подходили для каждого варианта использования (например, Windows Workflow), проходя через два рабочих процесса одновременно.

Я думаю, что URL в строке запроса может поддержать это, но мне интересно, если кто-нибудь еще сделал подобную реализацию.

[Правка] Вариант использования: скажем, я пишу приложение, которое использует что-то вроде Windows Workflow. Каждый рабочий процесс пользовательского интерфейса может выполнять такие действия, как сбор настроек страницы и выполнение какого-либо внешнего процесса. Я могу захотеть сделать два из этих рабочих процессов одновременно (не обязательно один и тот же рабочий процесс пользовательского интерфейса). Таким образом, если бы я сохранил в сессии, я бы получил:

а) Различные вкладки, влияющие на рабочий процесс. б) Кнопки "Предыдущая / Следующая" было бы чрезвычайно сложно разработать из-за а).

Мне бы хотелось, чтобы либо пользователь не мог открыть другую вкладку для URL-адреса (не думаю, что это 100% способ предотвратить это), либо позволил бы пользователю использовать рабочий процесс в отдельности, не затрагивая одну (как запуск двух рабочих процессов в двух разных браузерах).

Надеюсь, это дает представление о том, что я пытаюсь сделать.

С уважением, J

2 ответа

Решение

Похоже, вы пытаетесь сделать следующее:

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

Таким образом, на вкладке A вы ввели "Имя" в качестве имени и отправили, и теперь вы находитесь на второй странице вкладки A. Вы решаете, что собираетесь сделать вопрос также для своего друга, поэтому вы открываете новую вкладку "Tab B". На вкладке B вы вводите Tom и отправляете страницу.

В настоящее время в браузере у вас есть вкладка A, которая находится на странице 2 вопросника с firstname = "Mark", и вкладка B, которая находится на странице 2 вопросника с first name = "Tom". Предполагая, что вы хотите сохранить оба этих параметра в сеансе на сервере, вот подход, который, я думаю, будет работать для вас.

Когда веб-браузер запрашивает страницу 1 вашей формы, по запросу GET (на сервер не отправляются данные вопросника) вы вводите скрытое поле в HTML-ответ и генерируете случайное число для хранения в этом поле. Когда эта форма отправлена, вы делаете следующее на сервере:

  1. Смотрите в сеансе, используя случайное число в качестве ключа "var questionaire = session[Request.Form["questionaire_rnumber"]]
  2. если вопросник не находится в сеансе, вы создаете новый вопросник, обновляете его свойства и вставляете его в сеанс

    var questionaire = new Анкета ();
    questionaire.FirstName = Request.Form ["firstName"]
    сеанс [Request.Form["questionaire_rnumber"]] = вопросник;

если вопросник находился в сеансе, вы просто обновляете объект и отображаете следующую страницу, однако при отображении следующей страницы вы захотите снова указать скрытое поле случайных чисел в html, используя то же случайное число, которое вы использовали на странице 1.

Таким образом, вы можете держать любое количество анкет за один сеанс. С MVC.NET вам будет просто добавить поле случайных чисел в вашу модель представления и добавить логику для поиска в сеансе существующего вопросника или создания нового, и я думаю, что вам будет хорошо.

Также следует помнить о возможных проблемах с подходом, таких как проблемы с кнопками "назад", проблемы безопасности и проблемы с производительностью.

Одним из примеров проблем безопасности и производительности может быть то, что злоумышленник понимает, что ваше приложение работает так, и злоумышленник запрашивает страницу 1 вашей формы 10000 раз и каждый раз отправляет страницу 1. За один сеанс пользователя у вас будет 10 000 вопросников. Если злоумышленник удалял свой файл cookie с идентификатором сеанса 10000 раз и для каждого файла cookie с идентификатором сеанса он создавал 10 000 запросов на страницу 1 и отправлял форму страницы 1, у вас было бы 100 000 объектов вопросника в совокупности на 10000 сеансов на вашем сервере. Таким образом, вы должны наложить некоторые ограничения на него, чтобы защитить ваше приложение, например:

  1. Любая отдельная сессия может иметь только X анкет в сессии
  2. Любой отдельный IP-адрес может иметь только Y одновременных сеансов (это вам, вероятно, потребуется отслеживать в объекте Application)

ДОПОЛНИТЕЛЬНЫЙ ОТВЕТ НА ДОБАВЛЕНИЕ ИСПОЛЬЗОВАНИЯ

Спасибо за вариант использования. Мое решение все еще должно работать для вас. У вас есть два варианта.

Если вы хотите убедиться, что с вашим рабочим процессом работает только одна вкладка, то при передаче случайного числа на сервер из новой вкладки вы сможете обнаружить, что выполняется другой рабочий процесс и что случайное число из нового Вкладка не совпадает со случайным числом из первого, поэтому вы выдадите исключение и покажете пользователю сообщение, в котором говорится, что он не может начать новый рабочий процесс, пока не завершится первый, и спросите, хотят ли они отменить первый. Вы должны спросить, хотят ли они отменить его, потому что, если они закроют свой браузер в первом запущенном им рабочем процессе, они застрянут, пока не истечет их сеанс. Что не произойдет, если они продолжают пытаться начать новый рабочий процесс.

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

Надеюсь это поможет.

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

Другие вопросы по тегам