Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Фильтры аутентификации появились в ASP.NET MVC 5. Их предназначение - управление аутентификацией пользователей.
Фильтры аутентификации срабатывают до любого другого фильтра и выполнения метода, а также тогда, когда метод уже завершил выполнение, но его результат - объект ActionResult - не обработан.
Любой фильтр аутентификации реализует интерфейс IAuthenticationFilter
:
namespace System.Web.Mvc.Filters { public interface IAuthenticationFilter { void OnAuthentication(AuthenticationContext filterContext); void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext); } }
Реализация метода OnAuthentication призвана обеспечить проверку пользователя: аутентифицирован ли он в системе. А метод OnAuthenticationChallenge используется для ограничения доступа для аутентифицированного пользователя.
Посмотрим на примере и создадим свой фильтр аутентификации. Возьмем какой-либо проект MVC 5, который использует аутентификацию. Создадим в нем для хранения фильтра специальную папку Filters и добавим в нее следующий класс MyAuthAttribute:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Filters; namespace AuthFilterApp.Filters { public class MyAuthAttribute : FilterAttribute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { var user = filterContext.HttpContext.User; if (user == null || !user.Identity.IsAuthenticated) { filterContext.Result = new HttpUnauthorizedResult(); } } public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) { var user = filterContext.HttpContext.User; if(user==null || !user.Identity.IsAuthenticated) { filterContext.Result = new RedirectToRouteResult( new System.Web.Routing.RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); } } } }
Во-первых, чтобы создать свой фильтр, нам надо унаследовать класс от класса FilterAttribute, а также реализовать интерфейс IAuthenticationFilter.
Реализацию двух его методов довольно проста. Каждый метод принимает в качестве параметра filterContext
, который унаследован от контекста
контроллера ControllerContext и содержит всю необходимую информацию о контексте запроса. В том числе он позволяет узнать всю информацию о пользователе, аутентифицирован ли он и т.д.
И если пользователь не аутентифицирован, то мы возвращаем определенный результат: filterContext.Result = new HttpUnauthorizedResult()
,
который говорит о том, что доступ к данному ресурсу для пользователя запрещен. Во втором методе подобным образом мы перенаправляем пользователя на страницу
логина через filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "Account" },
{ "action", "Login" }});
Простенький фильтр готов, и теперь мы модем его применить. Например, у нас есть по умолчанию в проекте контроллер HomeController. Применим фильтр к одному из его действий:
public class HomeController : Controller { [MyAuthAttribute] public ActionResult Index() { return View(); } }
Теперь, если мы не залогинились на сайте, то доступ к действию будет запрещен, и нас будет перенаправлять на страницу логина.