MVC 5种子用户和角色

MrB*_*nzy 91 asp.net-mvc seeding ef-migrations asp.net-mvc-5

我一直在玩新的MVC 5,我有一些模型,控制器和视图设置使用代码优先迁移.

我的问题是如何为用户和角色提供种子?我目前在Configuration.cs中的Seed方法中播放一些参考数据.但是在我看来,在第一次点击AccountController之前,不会创建用户和角色表.

我目前有两个连接字符串,所以我可以将我的数据从我的身份验证分成不同的数据库.

如何让用户,角色等表格与我的其他人一起填充?而不是当帐户控制器被击中?

Val*_*lin 175

以下是通常种子方法的示例:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用了包管理器"update-database".数据库和所有表都已创建并附加数据.

  • 我在新的mvc 5 Web应用程序中将此代码复制并粘贴到我的Seed方法中,然后在包管理器控制台中运行"update-database".它添加了角色(我可以在AspNetRoles表中看到它),但是当涉及到行manager.AddToRole(user.Id,"AppAdmin")时,我收到错误消息"找不到UserId".如果你知道我错过了什么,我非常感谢这些信息. (10认同)
  • @Zapnologica Migrations非常易于使用.它还允许您编辑表而无需重新创建表.使用NuGet包管理器控制台只需要三个命令即可熟悉它们.启用 - 迁移,添加迁移和更新 - 数据库.容易豌豆. (4认同)
  • 到Configuration类的Seed方法.配置是enable-migrations的默认类名,但您可以更改它. (3认同)
  • 您应该在包管理器控制台中使用"enable-migrations".它将为您创建带种子方法的配置类. (3认同)
  • 错过了`context.Users.Add(user);``manager.Create(user,"ChangeItAsap!");`和`manager.AddToRole(user.Id,"AppAdmin");`.所以新生用户没有User.Id. (2认同)
  • 这个答案似乎不再适用于较新的版本,因为您不能再实例化UserManager和RoleManager. (2认同)

Kev*_*vin 15

这是一个小小的补充,但对于任何"未找到UserId"的人来说.尝试播种时的消息:(汤姆里根在评论中有这个问题,我自己被困在了一段时间)

这意味着manager.Create(用户,"ChangeItAsap!")未成功.这可能有不同的原因,但对我来说这是因为我的密码没有成功验证.

我有一个自定义密码验证器,在播种数据库时没有被调用,因此我习惯的验证规则(minlength 4而不是默认值6)不适用.确保您的密码(以及所有其他相关字段)正在通过验证.

  • 这帮助了我,因为我遇到了"UserId not found"问题.我设法使用以下代码跟踪它:`IdentityResult result = manager.Create(user,"ChangeItAsap!"); if(result.Succeeded == false){throw new Exception(result.Errors.First()); }` (7认同)

Vas*_*hev 14

这是我基于Valin回答的方法,我在db中添加了角色并为用户添加了密码.此代码放在Seed()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]);
    }
Run Code Online (Sandbox Code Playgroud)


Mr *_*jai 5

在这里,我有一个非常简单,干净,顺畅的解决方案.

 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);
    }
Run Code Online (Sandbox Code Playgroud)