Инициализация БД ролями и пользователями

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

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

Нередко возникает необходимость, чтобы база данных к моменту первого обращения приложения уже содержала начальные данные, например, базовые роли и учетную запись администратора.

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

using CustomIdentityApp.Models;  // пространство имен модели User
using Microsoft.AspNetCore.Identity;
using System.Threading.Tasks;

namespace CustomIdentityApp
{
    public class RoleInitializer
    {
        public static async Task InitializeAsync(UserManager<User> userManager, RoleManager<IdentityRole> roleManager)
        {
            string adminEmail = "admin@gmail.com";
            string password = "_Aa123456";
            if (await roleManager.FindByNameAsync("admin") == null)
            {
                await roleManager.CreateAsync(new IdentityRole("admin"));
            }
            if (await roleManager.FindByNameAsync("employee") == null)
            {
                await roleManager.CreateAsync(new IdentityRole("employee"));
            }
            if (await userManager.FindByNameAsync(adminEmail) == null)
            {
                User admin = new User { Email = adminEmail, UserName = adminEmail };
                IdentityResult result = await userManager.CreateAsync(admin, password);
                if (result.Succeeded)
                {
                    await userManager.AddToRoleAsync(admin, "admin");
                }
            }
        }
    }
}

В классе определен метод InitializeAsync(), который добавляет в базу данных две роли - "admin" и "user", а также одного пользователя - администратора. Для добавления здесь применяются методы классов UserManager и RoleManager, которые нам доступны через коллекцию сервисов приложения.

Для краткости все данные (логин и пароль администратора) здесь определены в коде, но естественно можно указать значения и в файле конфигурации и затем передавать в метод.

Используем данных класс в классе Program при старте приложения:

using System;
using System.Threading.Tasks;
using CustomIdentityApp.Models;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace CustomIdentityApp
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var userManager = services.GetRequiredService<UserManager<User>>();
                    var rolesManager = services.GetRequiredService<RoleManager<IdentityRole>>();
                    await RoleInitializer.InitializeAsync(userManager, rolesManager);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }

            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Здесь с помощью метода services.GetRequiredService() получаем сервисы UserManager и RoleManager и передаем их в метод RoleInitializer.InitializeAsync. Причем поскольку здесь используется асинхронная версия метода Main, то нам необходимо установить в параметрах проекта в качестве версии языка как минимум версию 7.1, начиная с которой и была добавлена поддержка асинхронных методов Main.

В итоге при первом запуске в базу данных будут добавлены все необходимые данные, и мы сможем зайти из под администратора, используя указанные в коде логин и пароль.

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