Как предотвратить доступ пользователя к определенным внутренним маршрутам? - PullRequest
3 голосов
/ 25 октября 2011

У меня есть сайт с большим количеством маршрутов.

Некоторые маршруты, например /sector-overview, относятся к определенной странице, которую я хочу, чтобы пользователь видел.

Другие маршруты, например /sectoroverview относится к действию, которое в конечном итоге отображает частичное, которое включено на домашнюю страницу.

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

Я мог бы переименовать второй маршрут в что-то вроде /internal-sectoroverview, но это не решает проблему, просто скрывает ее.

Есть ли способ длямне запретить обработку запроса, если пользователь наберет это?Какой лучший способ для меня решить эту проблему?

Ответы [ 3 ]

8 голосов
/ 25 октября 2011

Вы можете заблокировать маршрут, используя ограничения маршрута . Однако в вашем случае я бы украсил ваше внутреннее действие с помощью [ChildActionOnly] следующим образом:

[ChildActionOnly]
public ActionResult Overview()
{
    return View();
}

При этом действие будет отображаться только при использовании @Html.Action или @Html.RenderAction. Если вы попытаетесь получить к нему доступ через браузер, вы получите сообщение об ошибке.

UPDATE

Чтобы вернуть 404 вместо ошибки, вы можете переопределить метод OnException на контроллере и обработать его там. Примерно так:

protected override void OnException(ExceptionContext filterContext)
{
    filterContext.ExceptionHandled = true;
    //check if filterContext.Exception was thrown by child action only (maybe by text)
    filterContext.Result = new HttpStatusCodeResult(404);
}
1 голос
/ 25 октября 2011

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

0 голосов
/ 21 апреля 2016

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

public PartialViewResult MyFunction()
{
   if( criteria ) {
      Response.StatusCode = 404;
      return null;
   }
}
...