How to Seed Users and Roles with Code First Migration using Identity ASP.NET Core

前端 未结 10 1546
离开以前
离开以前 2020-12-04 10:12

I have created a new clean asp.net 5 project (rc1-final). Using Identity Authentication I just have the ApplicationDbContext.cs with the following code:

publ         


        
相关标签:
10条回答
  • 2020-12-04 11:01

    My way of doing this is to create a class in models namespace.

    public class SampleData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.GetService<ApplicationDbContext>();
    
            string[] roles = new string[] { "Owner", "Administrator", "Manager", "Editor", "Buyer", "Business", "Seller", "Subscriber" };
    
            foreach (string role in roles)
            {
                var roleStore = new RoleStore<IdentityRole>(context);
    
                if (!context.Roles.Any(r => r.Name == role))
                {
                    roleStore.CreateAsync(new IdentityRole(role));
                }
            }
    
    
            var user = new ApplicationUser
            {
                FirstName = "XXXX",
                LastName = "XXXX",
                Email = "xxxx@example.com",
                NormalizedEmail = "XXXX@EXAMPLE.COM",
                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<ApplicationUser>();
                var hashed = password.HashPassword(user,"secret");
                user.PasswordHash = hashed;
    
                var userStore = new UserStore<ApplicationUser>(context);
                var result = userStore.CreateAsync(user);
    
            }
    
            AssignRoles(serviceProvider, user.Email, roles);
    
            context.SaveChangesAsync();
        }
    
        public static async Task<IdentityResult> AssignRoles(IServiceProvider services, string email, string[] roles)
        {
            UserManager<ApplicationUser> _userManager = services.GetService<UserManager<ApplicationUser>>();
            ApplicationUser user = await _userManager.FindByEmailAsync(email);
            var result = await _userManager.AddToRolesAsync(user, roles);
    
            return result;
        }
    
    }
    

    To run this code on startup. In Startup.cs at end of configure method just after route configuration add following code as Stafford Williams said before.

    SampleData.Initialize(app.ApplicationServices);
    
    0 讨论(0)
  • 2020-12-04 11:03

    Seems this thread is very old, but it will still work for someone who wants to seed their identity tables data in entityframework core.

    You can simple try the below.

    modelBuilder.Entity<IdentityUser>().HasData(
                   new IdentityUser { Id= "-1", UserName="sagark",PasswordHash="sagark", Email="emailid goes here" }
                   );
    
    0 讨论(0)
  • 2020-12-04 11:05

    The following line create the entry in the AspNetRoles table but does not populate the NormalizedName column.

    Substitute with the following for this column to be populated:

    RoleManager<IdentityRole> roleManager = serviceProvider.GetService<RoleManager<IdentityRole>>();
    roleManager.CreateAsync(new IdentityRole(role));
    
    0 讨论(0)
  • 2020-12-04 11:06

    Add the following class in Models namespace. It works for adding multiple users and roles, and will also add roles to existing users (e.g. facbook logins). Call it like this app.SeedUsersAndRoles(); from startup.cs

        using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNet.Builder;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.AspNet.Identity;
    
    namespace MyApplication.Models
    {
        public static class DataSeeder
        {
            public static async void SeedUsersAndRoles(this IApplicationBuilder app)
            {
                var context = app.ApplicationServices.GetService<ApplicationDbContext>();
                UserWithRoles[] usersWithRoles = {
                    new UserWithRoles("Admin", new string[] { "Administrator" , "Distributor" },"somepassword"),//user and optional roles and password you want to seed 
                    new UserWithRoles("PlainUser"),
                    new UserWithRoles("Jojo",new string[]{"Distributor" }) //seed roles to existing users (e.g. facebook login).
                };
    
                foreach (var userWithRoles in usersWithRoles)
                {
                    foreach (string role in userWithRoles.Roles)
                        if (!context.Roles.Any(r => r.Name == role))
                        {
                            var roleStore = new RoleStore<IdentityRole>(context);
                            await roleStore.CreateAsync(new IdentityRole(role));
                        }
                    var ExistingUser = context.Users.FirstOrDefault(p => p.NormalizedUserName == userWithRoles.User.NormalizedUserName);
                    if (ExistingUser == null) //the following syntax: !context.Users.FirstOrDefault(p => p.NormalizedUserName == userWithRoles.User.NormalizedUserName)) 
                                                //provokes execption:(ExecuteReader requires an open and available Connection.) 
                        await new UserStore<ApplicationUser>(context).CreateAsync(userWithRoles.User);
                    await app.AssignRoles(userWithRoles); //assign also to existing users.
                }
    
                context.SaveChangesAsync();
            }
    
            public static async Task<IdentityResult> AssignRoles(this IApplicationBuilder app, UserWithRoles uWR)
            {
                UserManager<ApplicationUser> _userManager = app.ApplicationServices.GetService<UserManager<ApplicationUser>>();
                ApplicationUser user = await _userManager.FindByNameAsync(uWR.User.NormalizedUserName);
                var result = await _userManager.AddToRolesAsync(user, uWR.Roles);
                return result;
            }
        }
        public class UserWithRoles
        {
            private ApplicationUser user;
            public ApplicationUser User { get { return user; } }
            public string[] Roles { get; set; }
            public UserWithRoles(string name, string[] roles = null, string password = "secret")
            {
                if (roles != null)
                    Roles = roles;
                else
                    Roles = new string[] { };
                user = new ApplicationUser
                {
                    Email = name + "@gmail.com", NormalizedEmail = name.ToUpper() + "@GMAIL.COM",
                    UserName = name, NormalizedUserName = name.ToUpper(),
                    PhoneNumber = "+1312341234",
                    EmailConfirmed = true,
                    PhoneNumberConfirmed = true,
                    SecurityStamp = Guid.NewGuid().ToString("D"),
                };
                user.PasswordHash = new PasswordHasher<ApplicationUser>().HashPassword(user, password);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题