Являются ли частичные просмотры хорошим способом ограничения доступа пользователей? - PullRequest
0 голосов
/ 07 декабря 2018

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

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 голосов
/ 07 декабря 2018

Таким образом, вы можете ограничить доступ пользователей, а неавторизованные пользователи не смогут получить доступ к частичным представлениям.

С другой стороны, лучшим подходом будет использование ролей пользователей для ограничения доступа.Например:

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();
    }
0 голосов
/ 07 декабря 2018

Однако являются ли они хорошим способом ограничения доступа пользователей?

Я бы сказал, нет, не с точки зрения безопасности, а с точки зрения удобства обслуживания.Представления должны быть представлением данных в формате 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();
  }
}

Может ли частичное представление вообще быть доступным для неавторизованных пользователей в моей текущей настройке.

Есликод, который вы указали, является единственным кодом, который возвращает эти Частицы, тогда ответом будет да .Однако его логика скрыта в виде, который я бы никогда не рекомендовал.

0 голосов
/ 07 декабря 2018

Просмотр бритвы отображается на сервере.Таким образом, конечный пользователь видит только результат логики.Если вы не зависите от некоторых внешних параметров (отправленных клиентом / пользователем), напр.Параметры запроса / маршрута / другие, которые указывают на привилегии, это нормально (конечно, если вы авторизуете / аутентифицируете пользователей, как это должно быть - с помощью авторизации attibute, а затем в отношении привилегий выполните некоторую логику).Однако, если эти 2 полностью отделены друг от друга (не используя ту же часть html, которая не является частью макета), я бы предпочел разделить их, так как не вижу здесь никакой выгоды от использования логики в представлении.

...