分视图是限制用户访问的好方法吗?

时间:2018-12-07 08:16:06

标签: c# asp.net-mvc asp.net-mvc-partialview

我过去使用局部视图来拆分大视图。但是,它们是限制用户访问的好方法吗?在我当前的设置中,未经授权的用户可以完全访问部分视图吗?

View:
    @if (ViewBag.UserType == 1)
    {
        @Html.Partial("PartialView/_StandardUser");
    }
    else if (ViewBag.UserType == 2)
    {
        @Html.Partial("PartialView/_AdminUser");
    }

Controller:
    public ActionResult Index()
    {
        ViewBag.UserType = 2;
        return View();
    }

3 个答案:

答案 0 :(得分:1)

剃刀视图在服务器上呈现。因此,最终用户只能看到逻辑结果。如果您不依赖某些外部参数(由客户端/用户发送),例如。查询/路由/其他指示特权的参数是可以的(如果您正在像应该对用户进行授权/身份验证那样,这是当然的-使用授权授权,然后考虑对特权进行一些逻辑处理)。但是,如果这2个是完全分开的(不使用html的同一部分,而这不是布局的一部分),我宁愿将它们分开,因为在这里看不到在视图中进行逻辑处理的任何好处。

答案 1 :(得分:0)

通过这种方式,您可以限制用户访问权限,并且未经授权的用户无法访问部分视图。

另一方面,更好的方法是使用用户角色来限制访问。例如:

View:
    @if (Request.IsAuthenticated && User.IsInRole("Administrators"))
    {
        @Html.Partial("PartialView/_AdminUser");
    }
    else if (Request.IsAuthenticated && User.IsInRole("StandardUses"))
    {
        @Html.Partial("PartialView/_StandardUser");
    }

Controller:
    [Authorize(Users = "Administrators,StandardUses")]
    public ActionResult Index()
    {
        return View();
    }

答案 2 :(得分:0)

  

但是,它们是限制用户访问的好方法吗?

我要说的不是,不是从安全角度出发,而是从可维护性角度出发。视图应该是数据的HTML表示形式。直接出于可维护性的考虑,应尽可能限制直接在视图中混合逻辑。

因此,以下逻辑

@if (ViewBag.UserType == 1)
{
  Html.RenderPartial("PartialView/_StandardUser");
}
else if (ViewBag.UserType == 2)
{
  Html.RenderPartial("PartialView/_AdminUser");
}

可以简单地替换为:

视图:

@{Html.RenderAction("UserView");

控制器方法:

public class SomeController
{
  public ActionResult UserView()
  {
    if (ViewBag.UserType == 1)
    {
      return Partial("PartialView/_StandardUser");
    }
    else if (ViewBag.UserType == 2)
    {
      return Partial("PartialView/_AdminUser");
    }
    return new EmptyResult();
  }
}
  

在我当前的设置中,未经授权的用户可以完全访问部分视图。

如果您提供的代码是唯一返回那些Partials的代码,那么答案是。但是,它的逻辑隐藏在视图中,我从不推荐。