MVC 5 Seed Users and Roles

前端 未结 7 1814
有刺的猬
有刺的猬 2020-11-28 01:56

I have been playing about with the new MVC 5, I have a few models, controller and views setup using code first migrations.

My question is how do I seed users and ro

相关标签:
7条回答
  • 2020-11-28 02:26

    Here i have an very easy,clean and smooth solution.

     protected override void Seed(UserContext context)
        { 
            //Step 1 Create the user.
            var passwordHasher = new PasswordHasher();
            var user = new IdentityUser("Administrator");
            user.PasswordHash = passwordHasher.HashPassword("Admin12345");
            user.SecurityStamp = Guid.NewGuid().ToString();
    
            //Step 2 Create and add the new Role.
            var roleToChoose = new IdentityRole("Admin");
            context.Roles.Add(roleToChoose);
    
            //Step 3 Create a role for a user
            var role = new IdentityUserRole();
            role.RoleId = roleToChoose.Id;
            role.UserId = user.Id;
    
             //Step 4 Add the role row and add the user to DB)
            user.Roles.Add(role);
            context.Users.Add(user);
        }
    
    0 讨论(0)
  • 2020-11-28 02:27
    protected override void Seed(ApplicationDbContext context)
    {
      SeedAsync(context).GetAwaiter().GetResult();
    }
    
    private async Task SeedAsync(ApplicationDbContext context)
    {
      var userManager = new ApplicationUserManager(new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context));
      var roleManager = new ApplicationRoleManager(new RoleStore<ApplicationRole, int, ApplicationUserRole>(context));
    
      if (!roleManager.Roles.Any())
      {
        await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AdminRoleName });
        await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AffiliateRoleName });
      }
    
      if (!userManager.Users.Any(u => u.UserName == "shimmy"))
      {
        var user = new ApplicationUser
        {
          UserName = "shimmy",
          Email = "shimmy@gmail.com",
          EmailConfirmed = true,
          PhoneNumber = "0123456789",
          PhoneNumberConfirmed = true
        };
    
        await userManager.CreateAsync(user, "****");
        await userManager.AddToRoleAsync(user.Id, ApplicationRole.AdminRoleName);
      }
    }
    
    0 讨论(0)
  • 2020-11-28 02:27

    write this code in your Migration Configuration.

    note: Use ApplicationDbContext in Configuration Class.

        internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = false;
        }
    
        protected override void Seed(ApplicationDbContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
                       context.Roles.AddOrUpdate(p =>
                p.Id,
                    new IdentityRole { Name = "Admins"},
                    new IdentityRole { Name = "PowerUsers" },
                    new IdentityRole { Name = "Users" },
                    new IdentityRole { Name = "Anonymous" }
                );
    
    
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:31

    Here is example of usual Seed approach:

    protected override void Seed(SecurityModule.DataContexts.IdentityDb context)
    {
        if (!context.Roles.Any(r => r.Name == "AppAdmin"))
        {
            var store = new RoleStore<IdentityRole>(context);
            var manager = new RoleManager<IdentityRole>(store);
            var role = new IdentityRole { Name = "AppAdmin" };
    
            manager.Create(role);
        }
    
        if (!context.Users.Any(u => u.UserName == "founder"))
        {
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            var user = new ApplicationUser {UserName = "founder"};
    
            manager.Create(user, "ChangeItAsap!");
            manager.AddToRole(user.Id, "AppAdmin");
        }
    }
    

    I used package-manager "update-database". DB and all tables were created and seeded with data.

    0 讨论(0)
  • 2020-11-28 02:34

    Looks like they changes the way authentication works in MVC5, changed my Global.asax.cs to the following did the trick!

    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    
    using System.Threading.Tasks;
    using MvcAuth.Models;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.Owin;
    using System.Threading;
    using Microsoft.AspNet.Identity.EntityFramework;
    
    namespace MvcAuth
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            async Task<bool> AddRoleAndUser()
            {
                AuthenticationIdentityManager IdentityManager = new AuthenticationIdentityManager(
                    new IdentityStore(new ApplicationDbContext()));
    
                var role = new Role("Role1");
                IdentityResult result = await IdentityManager.Roles.CreateRoleAsync(role, CancellationToken.None);
                if (result.Success == false)
                    return false;
    
                var user = new ApplicationUser() { UserName = "user1" };
                result = await IdentityManager.Users.CreateLocalUserAsync(user, "Password1");
                if (result.Success == false)
                    return false;
    
                result = await IdentityManager.Roles.AddUserToRoleAsync(user.Id, role.Id, CancellationToken.None);
                return result.Success;
            }
    
            protected async void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                bool x = await AddRoleAndUser();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:36

    This is my method base on Valin answer, I have added roles in db and added password for user. This code is placed in Seed() method in Migrations>Configurations.cs.

    // role (Const.getRoles() return string[] whit all roles)
    
        var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
        for (int i = 0; i < Const.getRoles().Length; i++)
        {
            if (RoleManager.RoleExists(Const.getRoles()[i]) == false)
            {
                RoleManager.Create(new IdentityRole(Const.getRoles()[i]));
            }
        }
    
    // user
    
        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
        var PasswordHash = new PasswordHasher();
        if (!context.Users.Any(u => u.UserName == "admin@admin.net"))
        {
            var user = new ApplicationUser
            {
                 UserName = "admin@admin.net",
                 Email = "admin@admin.net",
                 PasswordHash = PasswordHash.HashPassword("123456")
             };
    
             UserManager.Create(user);
             UserManager.AddToRole(user.Id, Const.getRoles()[0]);
        }
    
    0 讨论(0)
提交回复
热议问题