Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
ASP.NET Core имеет встроенную поддержку аутентификации на основе куки. Для этого в ASP.NET определен специальный компонент middleware, который сериализует данные пользователя в зашифрованные аутентификационные куки и передает их на сторону клиента. При получении запроса от клиента, в котором содержатся аутентификационные куки, происходит их валидация, десериализация и инициализация свойства User объекта HttpContext.
Рассмотрим на примере, как использовать простейшую аутентификацию в ASP.NET Core. Создадим новый проект ASP.NET Core Web App (Model-View-Controller):
Вначале опеределим в проекте в папке Models модель пользователя - класс User:
public class User { public int Id { get; set; } public string Email { get; set; } public string Password { get; set; } }
Для взаимодействия с MS SQL Server через Entity Framework добавим в проект через Nuget пакет Microsoft.EntityFrameworkCore.SqlServer. А затем добавим в папку Models класс контекста данных UsersContext:
using Microsoft.EntityFrameworkCore; namespace AuthApp.Models { public class UserContext : DbContext { public DbSet<User> Users { get; set; } public UserContext(DbContextOptions<UserContext> options) : base(options) { Database.EnsureCreated(); } } }
Далее в файле конфигурации appsettings.json определим настройки подключения к БД, которая будет хранить данные пользователей:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=userstoredb;Trusted_Connection=True;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
Изменим класс Startup для установки сервисов Entity Framework и подключения функицонала аутентификации и авторизации:
using AuthApp.Models; // пространство имен контекста данных UserContext using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace AuthApp { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { string connection = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext<UserContext>(options => options.UseSqlServer(connection)); // установка конфигурации подключения services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => //CookieAuthenticationOptions { options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login"); }); services.AddControllersWithViews(); } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); // аутентификация app.UseAuthorization(); // авторизация app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } } }
Здесь надо отметить два момента. Во-первых, в методе ConfigureServices()
производится установка и настройка всех необходимых сервисов:
// установка конфигурации подключения services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => //CookieAuthenticationOptions { options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login"); });
Для установки аутентификации с помощью куки в вызов services.AddAuthentication передается значение CookieAuthenticationDefaults.AuthenticationScheme. Далее с помощью метода AddCookie() настраивается аутентификация. По сути в этом методе производится конфигурация объекта CookieAuthenticationOptions, который описывает параметры аутентификации с помощью кук. В частности, в данном случае использовано одно свойство CookieAuthenticationOptions - LoginPath. Это свойство устанавливает относительный путь, по которому будет перенаправляться анонимный пользователь при доступе к ресурсам, для которых нужна аутентификация.
Второй момент - в методе Configure()
внедряем в конвейер необходимые компоненты middleware:
app.UseAuthentication(); // аутентификация app.UseAuthorization(); // авторизация
Метод app.UseAuthentication() встраивает в конвейер компонент AuthenticationMiddleware, который управляет аутентификацией. Его вызов позволяет установить значение для свойства HttpContext.User. И метод app.UseAuthorization() встраивает в конвейер компонент AuthorizationMiddleware, который управляет авторизацией пользователей и разграничивает доступ к ресурсам.
В данном случае стоит различать понятия "аутентификация" и "авторизация". Аутентификация отвечает на вопрос, кто пользователь. То есть посредством аутентификации мы идентифицируем пользователя, узнаем, кто он. А авторизация отвечает на вопрос, какие права в системе имеет пользователь, позволяет разграничить доступ к ресурсам приложения.