Предположим, необходимо создать сайт с содержимым, доступным только для зарегистрированных пользователей. При этом есть несколько страниц, которые могут просматривать все. Давайте рассмотрим как новые возможности ASP.NET MVC 4 упрощают решение такой задачи.
Решение для ASP.NET MVC 3
Разумеется, речь подойдёт об использовании только возможностей "из коробки". Поэтому, в ASP.NET MVC 3, чтобы закрыть незарегистрированным пользователям доступ к сайту, необходимо отметить почти каждое Действие атрибутом [Authorize]. Исключение составляют регистрация, авторизация и еще ряд в зависимости от задач сайта.
Такой подход несет в себе потенциальный источник опасности. Ведь при большом количестве страниц можно было просто забыть указать атрибут авторизации.
Вариант для ASP.NET MVC 4 и использование [AllowAnonymous]
Начиная с ASP.NET MVC 4 есть возможность решить поставленную задачу проще и, самое главное, надежнее.
Для примера создадим тестовый проект AllowAnonymousDemo на базе стандартного ASP.NET MVC 4 Internet Application. Затем добавим AuthorizeAttribute как глобальный фильтр (файл global.asax.cs):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
Теперь для просмотра любой страницы сайта пользователю потребуется предварительно ввести свои имя пользователя и пароль. Вроде все хорошо и нет необходимости помнить о добавлении атрибута [Authorize] для каждого Действия. Однако, здесь возникает новая проблема, из-за которой такое решение не использовалось в ASP.NET MVC 3. Ведь получается, что даже для регистрации и самой авторизации необходимо предварительно авторизоваться. Вроде бы как замкнутый круг.
Для решения этой задачи в ASP.NET MVC 4 появился новый атрибут [AllowAnonymous]. Он разрешает публичный доступ к отдельным Действиям при глобально установленном AuthorizeAttribute. Т.е. теперь вместо всех Действий, необходимо отметить их очень ограниченный список.
Обратите внимание, что в стандартном шаблоне ASP.NET MVC 4 Internet Application с помощью [AllowAnonymous] уже отмечены все необходимые Действия в AccountController (AccountController.cs, код методов убран для краткости).
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login()
{
.........
}
// POST: /Account/JsonLogin
[AllowAnonymous]
[HttpPost]
public JsonResult JsonLogin(LoginModel model, string returnUrl)
{
.........
}
// POST: /Account/Login
[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
.........
}
// GET: /Account/Register
[AllowAnonymous]
public ActionResult Register()
{
.........
}
// POST: /Account/JsonRegister
[AllowAnonymous]
[HttpPost]
public ActionResult JsonRegister(RegisterModel model)
{
.........
}
// POST: /Account/Register
[AllowAnonymous]
[HttpPost]
public ActionResult Register(RegisterModel model)
{
.........
}
Аналогично, можно разрешить всем посетителям сайта просматривать, например, страницу контактов:
[AllowAnonymous]
public ActionResult Contact()
{
ViewBag.Message = "Your quintessential contact page.";
return View();
}
Таким образом, для решения поставленной задачи, в ASP.NET 4.0 необходимо выполнить два действия:
- Установить глобально AuthorizeAttribute в методе RegisterGlobalFilters() (файл global.asax.cs).
- Указать атрибут [AllowAnonymous] для Действий, относящихся к страницам которые должны быть доступны всем посетителям сайта.