为了安全起见,我不希望任何人能够在我的网站上注册,但我无法阻止用户注册,而网站上有一个注册页面,所以我添加了一个“授权”标志ApplicationUser
模型:
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Authorized { get; set; }
}
这个想法是,如果用户(无论是否登录)没有将此属性的值设置为true,则用户将无法访问受保护的内容。以前授权的用户必须授权新用户。
这引起了如何让第一个用户获得授权的问题,所以我想我会在我的迁移中播种用户。见下文:
namespace Ortund.Migrations
{
internal sealed class Configuration :
DbMigrationsConfiguration<Ortund.Models.ApplicationDbContext>
{
protected override void Seed(Ortund.Models.ApplicationDbContext context)
{
context.Users.AddOrUpdate(
u => u.Id,
new Models.ApplicationUser { EmailAddress = "email@site.com", Authorized = true, EmailConfirmed = true }
);
}
}
}
显然我在这里缺少一些关键字段密码哈希一个,这就是我遇到麻烦的地方。
我不知道UserManager如何散列密码,所以我似乎无法复制该过程,因为该函数不是异步任务。
作为参考,这是AccountController中的Register方法:
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
...
}
}
CreateAsync函数指定将进行哈希处理的明文密码字符串。试图在上面的种子方法中复制这个,我只能访问ApplicationUserManager.Create(Microsoft.AspNet.Identity.Owin.IdentityFactorOptions<ApplicationUserManager> options, Microsoft.Owin.IOwinContext context)
,据我所知,这不符合我的要求。
如何在种子数据中创建完整的ApplicationUser?
答案 0 :(得分:5)
您可以调用UserManager.Create方法并将其传递给用户名和纯文本密码。这将为您散列密码并将其输入数据库
这样的事情:
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
var user = new ApplicationUser { UserName = "username"};
userManager.Create(user, "password");