Ограничить действие контроллера только с веб-сайта

Можно ли ограничить доступ к действиям контроллера для моих методов действий только запросами AJAX?

Я имею в виду, что не-Ajax-запрос к действию будет перенаправлен на 404 или выдана ошибка. Действие вернет правильный результат только в том случае, если запрос будет сделан JS на моей собственной странице.

Я пытался погуглить, но не нашел ответа. Я узнал, что могу реализовать собственный фильтр для этой цели, но, может быть, он уже существует в MVC?

Спасибо.


person Alex Dn    schedule 06.03.2013    source источник
comment
Я немного запутался в твоих намерениях. Вы хотите заблокировать несанкционированные запросы от пользователей, не прошедших проверку подлинности или с неправильной ролью?   -  person Dave Alperovich    schedule 07.03.2013
comment
Я хочу заблокировать только прямой запрос к действию (когда кто-то набирает www.mysite.com/controller/action в адресной строке браузера).   -  person Alex Dn    schedule 07.03.2013
comment
HttpPostAttribute достаточно для блокировки из панели браузера;)   -  person Olexander Ivanitskyi    schedule 07.03.2013
comment
@Olexander, будут ли сообщения без Ajax приемлемы для OP?   -  person Dave Alperovich    schedule 07.03.2013
comment
@DaveA, да, они будут, и вы абсолютно правы в своем ответе, более того, ваше решение не приведет к вероятному переписыванию существующих запросов jquery $.get() и $.getJSON(). Но, учитывая комментарий выше (о адресной строке браузера), запросы POST — это то, к чему пытается обратиться @AlexDn (ну, похоже:). Поэтому я оставил только комментарий, а не пост ;)   -  person Olexander Ivanitskyi    schedule 07.03.2013
comment
@Olexander HttpPostAttribute — хорошее решение, но в моем случае оно позволит размещать сообщения с внешних сайтов. Я хочу разрешить AJAX только с моего сайта.   -  person Alex Dn    schedule 07.03.2013


Ответы (1)


создать селектор метода настраиваемого действия для блокировки не-Ajax-вызовов

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

Ваш атрибут будет применяться классическим способом

[AjaxOnly]
public ActionResult Index()
{

Или вы можете применить его к своему контроллеру

[AjaxOnly]
public class HomeController : Controller
{

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

person Dave Alperovich    schedule 06.03.2013
comment
@IamStalker, чувствуй себя сегодня в своей зоне - person Dave Alperovich; 07.03.2013
comment
Похоже, мне нужно будет создать свой атрибут, который будет это делать. В дополнение к IsAjaxRequest я буду проверять, что запрос сделан с моего сайта (url-refferer или что-то в этом роде). - person Alex Dn; 07.03.2013