2009-07-15 2 views
2

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

Какой из них лучший способ?

ответ

4

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

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

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

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

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

2

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

+0

ОК спасибо. вопрос в том, что лучше, поместить его во все ваши контроллеры или настроить в одном файле web.config. Я выбираю web.config. – dritterweg

+0

Да, я не могу договориться об этом. :) – griegs

3

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

[Authorize] 
public class ProtectedBaseController : Controller { 

} 

public class AdminController : ProtectedBaseController { 
    ... 
} 

public class Admin2Controller : ProtectedBaseController { 
    ... 
} 
+1

Каким образом правильный ответ имеет наименьшее число голосов? – ckonig

0

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

Вы можете добавить фильтр GlobalFilters.Add (новый 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, потому что он не дает никаких гарантий, что вы система есть все контроллеры безопасности. Также этот способ не использует наследование, что делает проект более тяжелым.