Фильтры аутентификации

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Фильтры аутентификации появились в 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();
    }
}

Теперь, если мы не залогинились на сайте, то доступ к действию будет запрещен, и нас будет перенаправлять на страницу логина.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850