Добавление Identity в проект с нуля

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

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

Проект с типом аутентификации Individual User Accounts позволяет автоматически добавить все необходимые файлы для работы с ASP.NET Core Identity. Однако, как правило, редко востребован весь стандартный функционал, кроме того, нередко вознкает необходимость более детально настроить различные компоненты, из которых состоит Identity. И в реальности мы можем выбрать любой другой тип проекта и в него уже добавить вручную и подкорректировать функционал ASP.NET Core Identity. Это даст нам больший контроль над тем кодом, который размещается в проекте. Также это может быть актуально если у нас уже есть рабочий проект, но в него необходимо добавить поддержку ASP.NET Core Identity.

Итак, вначале создадим проект ASP.NET Core по шаблону ASP.NET Core Web App (Model-View-Controller) но без аутентификации:

Добавление ASP.NET Core Identity

Вначале добавим в папку Models новый класс User:

using Microsoft.AspNetCore.Identity;

namespace CustomIdentityApp.Models
{
    public class User : IdentityUser
    {
		public int Year { get; set; }
    }
}

Класс User представляет пользователя и наследуется от класса IdentityUser, перенимая все его свойства. Кроме того, для примера здесь добавлено свойство Year, которое будет представлять год рождения пользователя. При желании можно определить любые другие свойства.

Для взаимодействия с MS SQL Server через ASP.NET Core Identity добавим в проект через Nuget пакеты Microsoft.AspNetCore.Identity.EntityFrameworkCore и Microsoft.EntityFrameworkCore.SqlServer.

ASP.NET Core Identity и Entity Framework Core

Далее добавим в папку Models класс контекста данных ApplicationContext. Так как мы используем Identity, то класс контекста данных будет наследоваться не от DbContext, а от IdentityDbContext:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace CustomIdentityApp.Models
{
    public class ApplicationContext : IdentityDbContext<User>
    {
		public ApplicationContext(DbContextOptions<ApplicationContext> options)
            : base(options)
        {
			Database.EnsureCreated();
        }
    }
}

У нас есть контекст и модели, и теперь нам необходима база данных, которая будет хранить все данные. Вначале определим в файле appsettings.json строку подключения:

"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=usersstoredb;Trusted_Connection=True;"
  },

Далее нам надо изменить класс Startup, чтобы применить все необходимые сервисы для работы с Identity и базой данных:

using CustomIdentityApp.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;

namespace CustomIdentityApp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<User, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationContext>();
				
            services.AddControllersWithViews();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();	// подключение аутентификации
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

В методе ConfigureServices() добавляются сервисы для Entity Framework Core:

services.AddDbContext<ApplicationContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Далее добавляются специфичные для Identity сервисы:

services.AddIdentity<User, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationContext>();

Метод AddIdentity() позволяет установить некоторую начальную конфигурацию. Здесь мы указываем тип пользователя и тип роли, которые будут использоваться системой Identity. В качестве типа пользователя выступает созданный нами выше класс User, а в качестве типа роли взят стандартный класс IdentityRole, который находится в пространстве имен Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Метод AddEntityFrameworkStores() устанавливает тип хранилища, которое будет применяться в Identity для хранения данных. В качестве типа хранилища здесь указывается класс контекста данных.

Затем, чтобы использовать Identity, в методе Configure() устанавливается компонент middeware - UseAuthentication. Причем это middleware вызывается перед app.UseEndpoints(), тем самым гарантируя, что ко времени обращения к системе маршрутизации, контроллерам и их методам, куки должным образом обработаны и установлены.

Теперь система Identity подключена в проект, и мы можем с ней работать.

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