Содержание
Тема аутентификации и авторизации в ASP.NET Core довольно обширная и сложная, поэтому, чтобы в итоге не запутаться в том что, как и зачем мы делаем, вначале разберемся с основными моментами аутентификации и авторизации пользователей в ASP.NET Core, а, затем попробуем разработать свою систему проверки пользователей с нуля, используя пустой шаблон проекта ASP.NET Core.
Основные моменты аутентификации и авторизации пользователей в ASP.NET Core
Аутентификация (проверка подлинности) — это процесс установления личности пользователя. То есть аутентификация — это процесс, в результате которого мы получаем ответ на вопрос «Кто осуществляет вход в систему?» После того, как пользователь проходит аутентификацию и пробует получить доступ к ресурсу, запускается следующий процесс — авторизация.
Авторизация — это процесс определения, есть ли у пользователя доступ к ресурсу. Пользователь может быть аутентифицирован (определен), но, например, не может просматривать раздел с маркировкой «18+» так как его возраст менее 18 лет.
В ASP.NET Core оба этих процесса реализуются по схожей семантике и тесно связаны между собой. Так, аутентификация пользователя осуществляется сервисом IAuthenticationService
, который используется специальным компонентом middleware. В свою очередь, для авторизации пользователя используется сервис IAuthorizationService
, который также используется компонентом middleware.
Следующий момент — выбор схемы аутентификации пользователя. Схема аутентификации — это, по сути, определенная строка, по которой ASP.NET Core определяет конкретные обработчики аутентификации, т.е. отдельные классы, методы и т.д., которые реализуют процесс аутентификации (обычно, это классы, реализующие интерфейс IAuthenticationHandler
). Наиболее часто используемые схемы аутентификации — это
- аутентификация на основе JWT-токенов (название схемы «Bearer»)
- аутентификация на основе куки (название схемы «Cookies»)
Включение аутентификации пользователя в ASP.NET Core
Итак, для включения аутентификации пользователя в ASP.NET Core мы должны выполнить три действия:
- Добавить в проект сервис аутентификации
- Определить схему аутентификации
- Определить обработчик аутентификации
Реализуем все эти три шага на примере аутентификации с использованием JWT-токенов, используя пустой шаблон проекта ASP.NET Core. Создадим новый проект ASP.NET Core и добавим в него следующие строки:
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication("Bearer") //подключили сервис аутентификации и указали схему .AddJwtBearer(); //добавляем обработчик аутентификации, который получает токен из заголовоков запроса var app = builder.Build(); app.UseAuthentication(); //добавляем компонент middleware для аутентификации app.MapGet("/", () => "Hello World!"); app.Run(); } }
Здесь мы подключили сервис аутентификации пользователя на основе JWT-токенов и подключили в конвейер обработки запросов компонент middleware, который будет использовать сервис аутентификации. Если мы сейчас запустим приложение, то ничего нового для нас не произойдет — приложение также запустится и выведет заветную строку «Hello World!» в браузере так как в данный момент мы всего лишь сделали минимальные настройки аутентификации и никак не задействуем этот процесс в проекте — все пользователи, в том числе и не аутентифицированные имеют равный доступ к единственному ресурсу приложения — главной странице.
Чтобы ограничить доступ не аутентифицированным пользователям к какому-либо ресурсу мы должны включить в конвейер обработки запроса второй компонент middleware — авторизацию.
Включение авторизации пользователей в ASP.NET Core
Как было сказано выше — семантика для аутентификации и авторизации схожа. Мы должны подключить сервис авторизации и задействовать компонент middleaware:
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication("Bearer") .AddJwtBearer(); builder.Services.AddAuthorization(); //подключили сервис авторизации var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); //подключили компонент middleware авторизации app.MapGet("/", () => "Hello World!"); app.Run(); } }
Теперь создадим новую конечную точку, которая будет доступна только авторизованным пользователям. Здесь мы можем использовать два варианта:
ограничение доступа с помощью атрибута [Authorize]
app.MapGet("/auth", [Authorize]() => "Hello World!");
Атрибут [Authorize]
позволяет ограничить доступ к какому-либо ресурсу не авторизованным пользователям. Аналогичное ограничение на маршрут мы можем включить с помощью метода расширения RequireAuthorization
следующим образом:
app.MapGet("/auth", () => "Hello World!").RequireAuthorization();
Теперь можем посмотреть на работу приложения. Доступ к главной странице приложения открыт всем:
Попытка доступа к «/auth» будет пресечена:
Итого
В этой части мы, в общих чертах, познакомились с процессами аутентификации и авторизации пользователей в ASP.NET Core и настроили аутентификацию и авторизацию в проекте. В следующей части мы продолжим разрабатывать наше приложение и посмотрим как реализовать весь процесс аутентификации пользователя, используя одну из схем.