Я использую 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 для текущей страницы, на которой находится человек.
У кого-нибудь есть здесь какие-либо предложения помимо сессии? Я действительно, очень хочу избежать хранения чего-то подобного в сессии, если это возможно.