Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Нередко возникает необходимость, чтобы база данных к моменту первого обращения приложения уже содержала начальные данные, например, базовые роли и учетную запись администратора.
Для инициализации базы данных начальными ролями и пользователями определим новый класс 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.
В итоге при первом запуске в базу данных будут добавлены все необходимые данные, и мы сможем зайти из под администратора, используя указанные в коде логин и пароль.