Работал ли с Authorization Filter в ASP.NET Core?

«Работал ли с Authorization Filter в ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал. Authorization Filter — это компонент конвейера фильтров ASP.NET Core, который выполняется до метода действия (Action Method) и предназначен для проверки прав доступа пользователя.

Ключевые моменты:

  • Цель: Проверка авторизации (прав доступа), а не аутентификации (установления личности).
  • Место в конвейере: Выполняется после фильтров аутентификации (Authentication Filter), но до Resource Filter, Action Filter и самого метода.
  • Применение: Можно применять глобально, на уровне контроллера или отдельного действия.
  • Встроенные решения: Чаще всего используется атрибут [Authorize] с различными политиками (Policies) и требованиями (Requirements). Создание кастомного фильтра требуется для сложной бизнес-логики авторизации.

Пример кастомного Authorization Filter:

public class CustomAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // Проверяем наличие конкретного утверждения (claim) у пользователя
        var hasRequiredClaim = context.HttpContext.User.HasClaim("Permission", "CanEditArticle");

        if (!hasRequiredClaim)
        {
            // Если прав нет, устанавливаем результат, запрещающий доступ
            context.Result = new ForbidResult();
            // Или: context.Result = new UnauthorizedResult();
        }
        // Если проверка пройдена, конвейер продолжает работу
    }
}

// Применение фильтра к контроллеру или действию
[TypeFilter(typeof(CustomAuthorizationFilter))]
public class AdminController : Controller { }

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