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".数据库和所有表都已创建并附加数据.
Kev*_*vin 15
这是一个小小的补充,但对于任何"未找到UserId"的人来说.尝试播种时的消息:(汤姆里根在评论中有这个问题,我自己被困在了一段时间)
这意味着manager.Create(用户,"ChangeItAsap!")未成功.这可能有不同的原因,但对我来说这是因为我的密码没有成功验证.
我有一个自定义密码验证器,在播种数据库时没有被调用,因此我习惯的验证规则(minlength 4而不是默认值6)不适用.确保您的密码(以及所有其他相关字段)正在通过验证.
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)
在这里,我有一个非常简单,干净,顺畅的解决方案.
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)
| 归档时间: |
|
| 查看次数: |
60638 次 |
| 最近记录: |