【问题标题】:How to seed a user into the database with ASP.NET Identity?如何使用 ASP.NET Identity 将用户播种到数据库中?
【发布时间】:2017-03-07 09:44:16
【问题描述】:

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

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Authorized { get; set; }
}

这个想法是,如果用户(无论是否登录)没有将此属性的值设置为 true,则用户将无法访问受保护的内容。以前授权的用户必须授权新用户。

这引发了如何让第一个用户获得授权的问题,所以我想我会在我的 Migration 中为该用户播种。见下文:

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 函数指定将被散列的明文密码字符串。尝试在上面的 Seed 方法中复制它,我只能访问 ApplicationUserManager.Create(Microsoft.AspNet.Identity.Owin.IdentityFactorOptions&lt;ApplicationUserManager&gt; options, Microsoft.Owin.IOwinContext context),据我所知,这不符合我的要求。

如何在我的种子数据中创建完整的 ApplicationUser?

【问题讨论】:

  • 我已经很久没有这样做了,但我很确定你应该覆盖 DbContext 上的种子方法而不是迁移。
  • “授权”角色可以达到相同的目的,但适合现有的安全模型(这意味着您不必为了限制对操作的访问而跳槽)。回复:您当前的问题,让框架为您处理帐户设置。

标签: c# asp.net asp.net-mvc entity-framework-6 asp.net-identity-3


【解决方案1】:

您可以调用 UserManager.Create 方法并将用户名和纯文本密码传递给它。这将为您散列密码并将其输入数据库

类似这样的:

var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
var user = new ApplicationUser { UserName = "username"};
userManager.Create(user, "password");

【讨论】:

  • ... 然后设置Authorised 标志。
  • 我还不能调试这个,因为我在项目上还有很多事情要做,但是没有设计时错误,所以我给你一个赞成票这个答案
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2018-02-09
  • 2020-03-15
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2020-07-06
相关资源
最近更新 更多