如何防止用户访问某些内部路由?

时间:2011-10-25 10:49:27

标签: asp.net-mvc asp.net-mvc-routing

我有一个有很多路线的网站。

某些路线,例如/sector-overview指向我希望用户查看的特定页面。

其他路线,例如/sectoroverview是一个最终呈现主页上包含的部分的动作。

第二条路径仅仅是应用程序的内部路径,但如果用户在其地址栏中输入该路径(这是一个容易犯的错误),系统会将其视为有效请求并返回HTML部分。

可以将第二条路线重命名为/internal-sectoroverview,但这并不能解决问题,只是将其隐藏起来。

如果用户键入此请求,是否有任何方法可以阻止处理请求?我处理这个问题的最佳方式是什么?

3 个答案:

答案 0 :(得分:8)

您可以使用route constraints来阻止路线。但是,在您的情况下,我会使用[ChildActionOnly]来装饰您的内部操作:

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

通过执行此操作,仅在使用@Html.Action@Html.RenderAction时才会呈现操作。如果您尝试通过浏览器访问它,则会收到错误。

<强>更新

要返回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 :(得分:1)

如果我理解正确,你应该使用属性ChildActionOnly来解决部分未被调用的问题。如果你不希望你的行动中的某个方法可以被调用,那么仅供参考{ {3}}

答案 2 :(得分:0)

我有类似的问题,人们发现这可能也需要 - 如果从返回PartialViewResult的函数满足某个条件,我想返回404。我的解决方案是

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