Использование атрибута [AllowAnonymous] в ASP.NET MVC 4

Предположим, необходимо создать сайт с содержимым, доступным только для зарегистрированных пользователей. При этом есть несколько страниц, которые могут просматривать все. Давайте рассмотрим как новые возможности 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 необходимо выполнить два действия:

  1. Установить глобально AuthorizeAttribute в методе RegisterGlobalFilters() (файл global.asax.cs).
  2. Указать атрибут [AllowAnonymous] для Действий, относящихся к страницам которые должны быть доступны всем посетителям сайта.