如何使用ASP.NET标识将用户加入数据库?

时间:2017-03-07 09:44:17

标签: 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; }
}

这个想法是,如果用户(无论是否登录)没有将此属性的值设置为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?

1 个答案:

答案 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");