авторизация asp .net mvc - PullRequest
3 голосов
/ 15 июля 2009

Каков наилучший способ защиты определенных областей вашего веб-приложения в asp .net mvc. Я знаю, что мы можем поставить атрибут [Authorization] в каждом действии, но это кажется очень утомительным, так как вы должны поместить его повсюду. Я использую членство провайдера и пытаюсь сделать то же, что и в модели обратной передачи, установив эту защиту на основе папки. Я использую раздел web.config <location> для защиты некоторых папок. Я пробовал это в mvc, похоже, это работает, но в большинстве уроков используется способ [Authorization].

Какой метод лучше?

Ответы [ 5 ]

5 голосов
/ 15 июля 2009

Я бы настоятельно рекомендовал не помещать его в web.config. На самом деле, то же самое делают Конери, Хансельман, Хаак и Гатри, хотя и не очень (p223 в Professional ASP.NET MVC 1.0)

Маршруты могут быть изменены, особенно в MVC. В модели WebForm маршруты физически представлены в файловой системе, поэтому вам не пришлось об этом беспокоиться. В MVC маршруты являются «динамическими» из-за отсутствия лучшего термина.

В результате вы можете получить несколько маршрутов, сопоставляемых одному контроллеру, что может вызвать проблемы с обслуживанием в файле web.config. Хуже того, вы можете непреднамеренно заставить маршрут случайно вызвать контроллер или забыть обновить web.config после добавления / изменения маршрутов и оставить себя открытым.

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

Только мои 2 цента.

4 голосов
/ 26 сентября 2011

Одним из возможных решений является создание «защищенного контроллера» и использование его в качестве базового класса для всех областей вашего приложения, которые вы хотите защитить

[Authorize]
public class ProtectedBaseController : Controller { 

}

public class AdminController : ProtectedBaseController { 
  ...
}

public class Admin2Controller : ProtectedBaseController { 
  ...
}
3 голосов
/ 15 июля 2009

поставить [Авторизация] на вершину класса контроллера. это заблокирует все действия контроллеров.

0 голосов
/ 13 ноября 2018

Авторизация - это один из способов защиты вашего приложения; это применить атрибут к каждому контроллеру. Другой способ - использовать новый атрибут AllowAnonymous при входе в систему и регистрировать действия. Принятие безопасных решений на основе текущей области - очень плохая вещь, и ваше приложение будет подвержено уязвимостям.

Код вы можете получить здесь

Поскольку ASP.NET MVC 4 содержит новый атрибут AllowAnonymous, вам больше не нужно писать этот код.
После глобальной настройки AuthorizeAttribute в global.asax и последующего белого списка будет достаточно. Эти методы, которые вы хотите отказаться от авторизации, считаются наилучшей практикой для защиты ваших методов действий. Спасибо.

0 голосов
/ 14 декабря 2015

Вы можете установить [Authorize] для каждого контроллера, который вам нужен.

Вы можете добавить фильтр GlobalFilters.Add (new AuthorizeAttribute ()); в файле Startup.cs (или Global.asax) и поместите атрибут [AllowAnonymus] для любого контроллера или действия, которое вы разрешаете незарегистрированным пользователям.

Если вы решили установить [Авторизовать] на каждом безопасном контроллере, вы должны быть уверены, что любой контроллер, добавленный вами или кем-либо еще в команде, будет в безопасности. Для этого требования я использую такой тест:

[Fact]
public void AllAuth()
{
    var asm = Assembly.GetAssembly(typeof (HomeController));
    foreach (var type in asm.GetTypes())
    {
        if (typeof(Controller).IsAssignableFrom(type))
        {
            var attrs = type.GetCustomAttributes(typeof (AuthorizeAttribute));
            Assert.True(attrs.Any());
        }
    }
}

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

...