如何使用ASP.NET Identity将用户播种到数据库中?

Ort*_*und 0 c# asp.net asp.net-mvc entity-framework-6 asp.net-identity-3

为了安全起见,我不希望任何人都可以在我的网站上进行注册,但是当网站上有可访问的注册页面时,我不能阻止用户进行注册,因此我在ApplicationUser模型中添加了“授权”标志:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Authorized { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果一个用户,无论是登录还是不行,没有这个属性设置为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 }
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,我在这里缺少一些关键字段,这是我遇到麻烦的地方。

我不知道UserManager如何对密码进行哈希处理,因此我似乎无法在此处复制该过程,因为该函数不是异步Task。

作为参考,这是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);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

该CreateAsync函数指定将被散列明文密码字符串。试图在我的种子上面的方法复制此,我只需要访问ApplicationUserManager.Create(Microsoft.AspNet.Identity.Owin.IdentityFactorOptions<ApplicationUserManager> options, Microsoft.Owin.IOwinContext context)它,据我所看到的,在这里不适合我的要求。

我怎么可以在我的种子数据的完整ApplicationUser?

Jin*_*ish 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");
Run Code Online (Sandbox Code Playgroud)