Аутентификация и авторизация

Аутентификация на основе куки. Часть 1

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

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

ASP.NET Core имеет встроенную поддержку аутентификации на основе куки. Для этого в ASP.NET определен специальный компонент middleware, который сериализует данные пользователя в зашифрованные аутентификационные куки и передает их на сторону клиента. При получении запроса от клиента, в котором содержатся аутентификационные куки, происходит их валидация, десериализация и инициализация свойства User объекта HttpContext.

Рассмотрим на примере, как использовать простейшую аутентификацию в ASP.NET Core. Создадим новый проект ASP.NET Core Web App (Model-View-Controller):

Аутентификация в ASP.NET Core

Вначале опеределим в проекте в папке 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, который управляет авторизацией пользователей и разграничивает доступ к ресурсам.

В данном случае стоит различать понятия "аутентификация" и "авторизация". Аутентификация отвечает на вопрос, кто пользователь. То есть посредством аутентификации мы идентифицируем пользователя, узнаем, кто он. А авторизация отвечает на вопрос, какие права в системе имеет пользователь, позволяет разграничить доступ к ресурсам приложения.

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