ASP.NET MVC: jQuery Address не позволяет пользователю переходить на прямой URL - PullRequest
1 голос
/ 28 октября 2011

Мы разрабатываем приложение Ajax и используем плагин jQuery Address для загрузки различных страниц приложения. Поэтому URL-адреса нашего сайта выглядят следующим образом: www.app.com # / SomeController / SomeAction.При переходе по такому URL-адресу загружается маршрут по умолчанию для приложения, а затем адрес jQuery используется для загрузки URL-адреса SomeController / SomeAction в элемент div на странице.

Проблема заключается в том, что пользователь все еще может получить доступ к www.app.com / SomeController / SomeAction (без знака хеша) напрямую, введя URL-адрес в браузере.Как мы можем предотвратить прямой доступ пользователей к страницам и требовать, чтобы у них был хэш-знак, чтобы страницы загружались по запросу Ajax?

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Создайте маршрут для добавления до вашего маршрута по умолчанию, например:

routes.MapRoute(
    "404 non-hashed",
    "{*fullPath}",
    new { controller = "Error", action = "Show404" },
    new { fullPath = @"^(?!#).+" }
);

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

Создайте контроллер и действие, чтобы отобразить страницу 404 или какую-то пользовательскую страницу ошибки, и все готово.

1 голос
/ 28 октября 2011

Вы можете создать фильтр, который проверяет request.isajaxrequest (). Вы отклоняете все запрошенные запросы, кроме маршрута по умолчанию.

Я не уверен, что это лучший способ.

0 голосов
/ 01 ноября 2011

counsellorben верен, вы можете сделать трюки с маршрутизацией, чтобы попытаться ограничить способ, которым законные клиенты или приложения запрашивают определенный ресурс, но вы никогда не сможете защитить себя от подделки (с помощью fiddler или другого инструмента).Подход, предложенный counsellorben, полезен только для того, чтобы избежать путаницы среди пользователей и ограничить область «API» приложения.Конечно, у вас не должно быть приложения, которое зависит только от # глубоких ссылок, потому что это вызывает проблемы с SEO и т. Д. Но это другое обсуждение.

Другой подход, а не фильтр, вы можете добавитьследуя вашему методу действия

if (this.HttpContext.Request.IsAjaxRequest() != true)
            return RedirectToAction("Index");

стандартная практика здесь, чтобы дать якору пустое или фиктивное свойство href и чтобы событие click выполняло обратный вызов AJAX?Таким образом, если пользователь копирует гиперссылку, ему просто автоматически дается правильный URL.

...