ASP.NET MVC: Авторизация в Действии - Предложенные Шаблоны или это являются запахом?

Ответы, написанные здесь, чрезвычайно устарели или даже иногда не имеют смысла. Многое изменилось со старого 2009 года, поэтому я постараюсь ответить на него правильно.

Краткий ответ - вам определенно следует минимизировать HTML . Это тривиально сегодня и дает примерно 5% ускорение . Для более длинного ответа прочитайте весь ответ

В старые времена люди вручную минимизировали css / js (запустив его через какой-то конкретный инструмент для минимизации). Было довольно сложно автоматизировать процесс и определенно требовал определенных навыков. Зная, что многие сайты высокого уровня даже сейчас не используют gzip (что тривиально), понятно, что люди неохотно минимизировали html.

Так почему же люди минимизировали js, а не html ? Когда вы минимизируете JS, вы делаете следующее:

  • удаляете комментарии
  • удаляете пробелы (табуляции, пробелы, новые строки)
  • меняете длинные имена на короткие (var isUserLoggedIn до var a)

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

Один неверный аргумент, написанный здесь, заключается в том, что, поскольку контент подается с помощью gzip, минимизация не имеет смысла. Это совершенно неправильно. Да, имеет смысл, что gzip уменьшает улучшение минификации, но зачем вам gzip комментарии, пробелы, если вы можете правильно их обрезать и gzip только важную часть. Это то же самое, что если у вас есть папка для архивирования, в которой есть какая-то хрень, которую вы никогда не будете использовать, и вы решаете просто сжать ее вместо очистки и застегнуть ее.

Другой аргумент, почему бессмысленно заниматься минимизацией, заключается в том, что это утомительно. Возможно, это было правдой в 2009 году, но после этого появились новые инструменты. Прямо сейчас вам не нужно вручную уменьшать разметку. С такими вещами, как Grunt , тривиально установить grunt-contrib-htmlmin и настроить его для минимизации вашего html. Все, что вам нужно, это как 2 часа, чтобы выучить хрюканье и все настроить, а затем все будет выполнено автоматически менее чем за секунду. Похоже, что 1 секунда (которую вы можете даже автоматизировать, чтобы ничего не делать с grunt-contrib-watch ), на самом деле не так уж плоха, примерно для 5% улучшений (даже с gzip).

Еще один аргумент в том, что CSS и JS являются статическими , а HTML генерируется сервером, поэтому вы не можете предварительно минимизировать его. Это было также верно в 2009 году, но в настоящее время больше и больше сайтов выглядят как одностраничное приложение, где сервер тонкий, а клиент выполняет всю маршрутизацию, создание шаблонов и другие. логика. Таким образом, сервер только дает вам JSON , а клиент отображает его. Здесь у вас есть много HTML для страницы и различных шаблонов.

Итак, чтобы закончить мои мысли:

  • Google минимизирует HTML.
  • pageSpeed ​​ просит вас минимизировать html
  • сделать это тривиально
  • это дает ~ 5% улучшения
  • это не такой же как gzip

10
задан anonymous 20 May 2009 в 18:57
поделиться

4 ответа

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

Для номера 1 существует ряд шаблонов, которые обеспечивают расширенное поведение в объектах предметной области. При двойной отправке вы передаете ссылку на абстракцию (интерфейс) службы методу объекта. Тогда он сможет делать свое дело. Вы также можете написать прикладную службу, которая принимает Отгрузку и выполняет работу.

По номеру 2, не обязательно. Возможно, вам придется абстрагировать концепцию «контекстной доставки» в сервисе, который определяет, в каком контексте доставки вы находитесь. Но я бы сказал это, пока она вам снова не понадобится.

2
ответ дан 4 December 2019 в 02:52
поделиться

В дополнение к приведенному выше ответу вы можете верните HttpUnauthorizedResult вместо создания собственного представления для NotAuthorized. Это приведет к перенаправлению на страницу входа и будет вести себя так же, как обычный атрибут [Authorize]

1
ответ дан 4 December 2019 в 02:52
поделиться

Вы можете взглянуть на Rhino.Security , его можно использовать для реализации авторизации пользователей в таких сценариях.

1
ответ дан 4 December 2019 в 02:52
поделиться

Я не вижу проблем с методом Action, выполняющим в нем дальнейшие проверки авторизации. Вы можете использовать поставщика ролей для детальной авторизации, которую вы ищете. Пожалуйста, извините за мой синтаксис - вероятно, он грубый, и я его не тестировал.

[Authorize(Roles="Shipping, Accounting")]
public ActionResult Edit(int id)
{
    Shipment shipment = repos.GetShipment(id);


    switch (shipment.State)
    {
         case ShipmentState.A:
         if (Roles.IsUserInRole("Shipping"))
                return View(shipment);
         else
                return View("NotAuthorized");
         break;
         case ShipmentState.B:
         if (Roles.IsUserInRole("Accounting"))
                return View(shipment);
         else
               return View("NotAuthorized");
         break;
         default:
              return View("NotAuthorized");
     }
}
3
ответ дан 4 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: