Saltar al contenido

Cómo sembrar usuarios y roles con Code First Migration usando Identity ASP.NET Core

Esta es la solución más completa que encomtrarás compartir, sin embargo estúdiala detenidamente y valora si es compatible a tu trabajo.

Solución:

Mi forma de hacer esto es crear una clase en el espacio de nombres de los modelos.

public class SampleData

    public static void Initialize(IServiceProvider serviceProvider)
    
        var context = serviceProvider.GetService();

        string[] roles = new string[]  "Owner", "Administrator", "Manager", "Editor", "Buyer", "Business", "Seller", "Subscriber" ;

        foreach (string role in roles)
        
            var roleStore = new RoleStore(context);

            if (!context.Roles.Any(r => r.Name == role))
            
                roleStore.CreateAsync(new IdentityRole(role));
            
        


        var user = new ApplicationUser
        
            FirstName = "XXXX",
            LastName = "XXXX",
            Email = "[email protected]",
            NormalizedEmail = "[email protected]",
            UserName = "Owner",
            NormalizedUserName = "OWNER",
            PhoneNumber = "+111111111111",
            EmailConfirmed = true,
            PhoneNumberConfirmed = true,
            SecurityStamp = Guid.NewGuid().ToString("D")
        ;


        if (!context.Users.Any(u => u.UserName == user.UserName))
        
            var password = new PasswordHasher();
            var hashed = password.HashPassword(user,"secret");
            user.PasswordHash = hashed;

            var userStore = new UserStore(context);
            var result = userStore.CreateAsync(user);

        

        AssignRoles(serviceProvider, user.Email, roles);

        context.SaveChangesAsync();
    

    public static async Task AssignRoles(IServiceProvider services, string email, string[] roles)
    
        UserManager _userManager = services.GetService>();
        ApplicationUser user = await _userManager.FindByEmailAsync(email);
        var result = await _userManager.AddToRolesAsync(user, roles);

        return result;
    


Para ejecutar este código en el inicio. En Startup.cs, al final del método de configuración, justo después de la configuración de la ruta, agregue el siguiente código como dijo Stafford Williams anteriormente.

SampleData.Initialize(app.ApplicationServices);

En el momento de escribir este artículo, no hay ningún complemento para sembrar la base de datos, pero puede crear una clase y agregarla a su contenedor para hacer lo mismo al iniciar la aplicación, así es como lo hice, primero crear una clase:

public class YourDbContextSeedData
{
    private YourDbContext _context;

    public YourDbContextSeedData(YourDbContext context)
    
        _context = context;
    

    public async void SeedAdminUser()
    
        var user = new ApplicationUser
        
            UserName = "[email protected]",
            NormalizedUserName = "[email protected]",
            Email = "[email protected]",
            NormalizedEmail = "[email protected]",
            EmailConfirmed = true,
            LockoutEnabled = false,
            SecurityStamp = Guid.NewGuid().ToString()
        ;

        var roleStore = new RoleStore(_context);

        if (!_context.Roles.Any(r => r.Name == "admin"))
        
            await roleStore.CreateAsync(new IdentityRole  Name = "admin", NormalizedName = "admin" );
        

        if (!_context.Users.Any(u => u.UserName == user.UserName))
        
            var password = new PasswordHasher();
            var hashed = password.HashPassword(user, "password");
            user.PasswordHash = hashed;
            var userStore = new UserStore(_context);
            await userStore.CreateAsync(user);
            await userStore.AddToRoleAsync(user, "admin");
        

        await _context.SaveChangesAsync();
    

Registre el tipo en ConfigureServices método de tu Startup.cs clase:

services.AddTransient();

Siguiente pase el YourDbContextSeedData clase a la Configure método de tu Startup.cs class y úsala:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, YourDbContextSeedData seeder)

  seeder.SeedAdminUser();

Puede sembrar usuarios y roles en el método OnModelCreating () dentro del archivo IdentityDbContext.cs como se muestra a continuación. Note que el keys deben estar predefinidos para evitar sembrar nuevos usuarios y roles cada vez que se ejecuta este método.

protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);

        //Seeding a  'Administrator' role to AspNetRoles table
        modelBuilder.Entity().HasData(new IdentityRole Id = "2c5e174e-3b0e-446f-86af-483d56fd7210", Name = "Administrator", NormalizedName = "ADMINISTRATOR".ToUpper() );


        //a hasher to hash the password before seeding the user to the db
        var hasher = new PasswordHasher();


        //Seeding the User to AspNetUsers table
        modelBuilder.Entity().HasData(
            new IdentityUser
            
                Id = "8e445865-a24d-4543-a6c6-9443d048cdb9", // primary key
                UserName = "myuser",
                NormalizedUserName = "MYUSER",
                PasswordHash = hasher.HashPassword(null, "Pa$$w0rd")
            
        );


        //Seeding the relation between our user and role to AspNetUserRoles table
        modelBuilder.Entity>().HasData(
            new IdentityUserRole
            
                RoleId = "2c5e174e-3b0e-446f-86af-483d56fd7210", 
                UserId = "8e445865-a24d-4543-a6c6-9443d048cdb9"
            
        );
        

    

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *