Users and Roles Seed

in ASPNET Core

Users and Roles Seed – AspNet Core

Reading Time: 2 minutes

Nello sviluppo di applicazioni ASPNET Core che necessitano l’integrazione con Identity può essere utile impostare il seed del database, in particolare di utenti/ruoli. Ovviamente, quando non siamo in produzione 🙂

Identiy aggiunge funzionalità di autenticazione e autorizzazione all’interno di applicazioni ASP.NET Core.

Il metodo più rapido per poter inserire una classe per il seed degli utenti è quello del file Program.cs dove generalmente sono impostate le operazioni che devono essere eseguite al running dell’applicazione.

In particolare, il metodo main (modificato in async) dovrà essere modificato nel seguente modo:

public static async Task Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                await DbSeeder.SeedDb(services);
            }

            host.Run();
        }

Il metodo che verrà utilizzato per il seed del database è DbSeeder.SeedDb, dove DbSeeder è una nuova classe creata proprio per l’operazione di seed.

Il metodo SeedDb(services) è di tipo asincrono e consente di effettuare le operazioni preliminari per il seed del database.

DbSeeder.SeedDb() – codice

La struttura del metodo SeedDb

public static async Task SeedDb(IServiceProvider services)
 {
   try
      {           
         var userManager = services.GetService<UserManager<IdentityUser>>();
         var roleManager = services.GetService<RoleManager<IdentityRole>>();
      
         //...
         //...
     }
}

accetta in ingresso IServiceProvider ed utilizza il metodo GetService per ottenere un’instanza di userManager e RoleManager. Utilizzando UserManager e RoleManager è possibile accedere direttamente al layer degli utenti e a quello dei ruoli. Supponiamo di dover creare i ruoli “admin” e “user”, possiamo quindi aggiungere il seguente codice al metodo SeedDb:

if (await roleManager.FindByNameAsync("Admin") == null)
    await roleManager.CreateAsync(new IdentityRole() { Name = "Admin" });           

 if (await roleManager.FindByNameAsync("User") == null)
    await roleManager.CreateAsync(new IdentityRole() { Name = "User" });

dove viene verificata la presenza dei ruoli prima della loro creazione.

La creazione di utenti è molto simile, supponiamo ad esempio di voler creare un utente pippo@pluto.it e di volerlo assegnare al gruppo “admin”:

if (await userManager.FindByEmailAsync("merlin.andrea@gmail.com") == null)
{
     var newUser = new IdentityUser() { UserName = pluto@pippo.it", Email = " pluto@pippo.it "};
     await userManager.CreateAsync(newUser, "PASSWORD");
     await userManager.AddToRoleAsync(newUser, "Admin");
}

Seguendo questa logica è possibile creare nuovi gruppi, nuovi utenti ed effettuare la loro associazione in fase di startup dell’applicazione. Ovviamente, solo per ambienti di test e NON in produzione.