Безопасность на уровне зоны для asp.net mvc

Я знаю, что для управления доступом можно украсить контроллер атрибутом Authorize, что я не знаю, является приемлемым или правильным способом обеспечения безопасности для всех контроллеров/представлений в Районе.

Есть ли что-то в web.config, регистрации области или в другом месте для применения безопасности авторизации?

Ответ 1

Удобный способ - создать новый базовый класс

[Authorize]
public abstract class AuthorizeBaseController :  Controller
{
}

и убедитесь, что все ваши контроллеры, для которых требуется авторизация (в вашем случае, все в области, о которой вы беспокоитесь) опускаются от AuthorizeBaseController.

public class HomeController : AuthorizeBaseController
{
  public ActionResult Index()
  {
    return View();
  }
}

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

Изменить. Проблема, с которой я использую подход <location path="" >, заключается в том, что, поскольку механизм маршрутизации позволяет любому маршруту вызывать любой контроллер, устанавливая авторизацию на основе URL-адреса (и, следовательно, конкретный маршрут) вместо действий контроллера позволяет вызвать контроллер, который должен быть защищен, и пропустить авторизацию. Это не проблема в веб-формах, поскольку страница была страницей (а не вызовом метода), но разделение между страницей/контуром и кодом в MVC делает это огромной дырой в безопасности.

Ответ 2

Безопасный способ только сделать это в приложении MVC - это делать то, что предлагает Дэвид, - приписывать базовый контроллер и иметь все контроллеры в подклассе области, что базовый контроллер.

Использование <location> тег для авторизации в MVC будет открывать дыры в вашем приложении. Вы не заинтересованы в защите URL-адресов или маршрутов. Вы хотите самим защитить контроллеры, поскольку они являются фактическими ресурсами, которые вы пытаетесь защитить. Поэтому защита должна быть размещена непосредственно на контроллерах.

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

Ответ 3

Как уже было предложено, вы можете использовать элемент <location /> в вашем web.config. В противном случае вы можете использовать класс базового контроллера для каждой области и украсить это с помощью AuthorizeAttribute, чтобы все контроллеры, которые наследовали его, также были отфильтрованы.

Ответ 4

вы всегда можете использовать <location path="" > <system.web> <authorization> deny or allow </authorization> </system.web> </location>