Как заставить пользователей не пропускать страницы через ввод URL в приложении asp.net mvc 2? - PullRequest
2 голосов
/ 18 августа 2010

Я использую ASP.NET MVC 2 & VS 2008 Pro.

Я создаю веб-сайт, на котором пользователи должны переходить со страницы A на страницу B на страницу C. Другими словами, порядок очень важен. Я хочу защититься от пользователя на странице A, просто введя URL для страницы C. Если пользователь попытался сделать такую ​​вещь, я бы хотел перенаправить его обратно на страницу, на которой он находился до того, как он ввел URL.

Кажется, я бы сделал фильтр действий для этого, но я, честно говоря, не уверен, какой тип мне понадобится. Мне нужен был бы доступ к URL-адресу, на котором был пользователь, и к URL-адресу, на который он собирается, и должен был бы их проверить.

Мысли

РЕДАКТИРОВАТЬ 1

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

LogUtil.Write("OnActionExecuting", String.Format("Referring Url: {0} \n Destination Url: {1} ",
                filterContext.RequestContext.HttpContext.Request.UrlReferrer.AbsoluteUri.ToString(),
                filterContext.RequestContext.HttpContext.Request.Url.AbsoluteUri.ToString() ));     

LogUtil - это просто пользовательский класс, который я написал и записывающий в файл журнала.

Пока это не красиво, но работает. У кого-нибудь есть более элегантное решение?

РЕДАКТИРОВАТЬ 2

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

String[] referrerSegments = filterContext.RequestContext.HttpContext.Request.UrlReferrer.Segments;

String[] destinationSegments = filterContext.RequestContext.HttpContext.Request.Url.Segments;

Выполните логику поиска действий, чтобы гарантировать, что destinationSegments [destinationSegments.length-1] следует после referrerSegments [referrerSegments-1]. Скорее всего, это будет сделано с помощью статической строки List, содержащей имена всех действий в приложении по порядку. Их значения индекса не должны быть больше 1 (т.е. целевое действие должно иметь индекс плюс или минус 1 от значения ссылающегося индекса действия).

Мысли

РЕДАКТИРОВАТЬ 3

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

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

1 Ответ

1 голос
/ 18 августа 2010

Фильтр действий - это именно то, что вам нужно, с перенаправлением, когда они непослушны. Отслеживайте их успехи в проверенном временем режиме, используя состояние сеанса.

Это сохраняет основную часть вашего приложения относительно не сохраняющей состояния (по сравнению с классическим ASP.NET) и сохраняет эту логику в фильтре действий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...