【问题标题】:Are partial views a good way to restrict user access?部分视图是限制用户访问的好方法吗?
【发布时间】:2018-12-07 08:16:06
【问题描述】:

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

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();
    }

【问题讨论】:

  • IMO 决定在视图中显示什么不是一个好主意,最好在服务器端决定。也t取决于你展示什么。标准用户的视图和管理员的视图有什么共同点吗?
  • 如果您有一些 [不] 想在视图上显示的按钮或部分,只需在您的操作方法上检查该内容是否可见(对于当前用户)。跨度>
  • @SeM 视图代码无论如何都运行在服务器端
  • @SamiKuhmonen 我的意思是在控制器中决定。
  • “好”不是一个技术术语,所以这里的答案大多是基于意见的。它本质上没有什么不安全的地方。如果您担心,请在局部视图本身中添加额外的 UserType 检查。

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


【解决方案1】:

Razor 视图在服务器上呈现。所以最终用户只能看到逻辑的结果。如果您不依赖某些外部参数(由客户端/用户发送),例如。指示特权的查询/路由/其他参数是可以的(当然,如果您正在授权/验证用户应该是这样 - 使用授权属性,然后关于特权做一些逻辑)。但是,如果这两个是完全分开的(不使用不是布局一部分的 html 的同一部分),我宁愿拆分它们,因为我看不到在视图中执行逻辑的任何好处。

【讨论】:

    【解决方案2】:

    这样您可以限制用户访问,并且部分视图不能被未经授权的用户访问。

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

    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();
        }
    

    【讨论】:

      【解决方案3】:

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

      我会说不,不是从安全的角度,而是从可维护性的角度。视图应该是数据的 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();
        }
      }
      

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

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

      【讨论】:

      • 我怎样才能实现部分视图的父级?例如,我在子文件夹中有部分视图,我希望它们包含在父索引视图中
      猜你喜欢
      • 2020-07-21
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2014-02-21
      • 2010-11-28
      相关资源
      最近更新 更多