【发布时间】: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<ApplicationUserManager> options, Microsoft.Owin.IOwinContext context),据我所知,这不符合我的要求。
如何在我的种子数据中创建完整的 ApplicationUser?
【问题讨论】:
-
我已经很久没有这样做了,但我很确定你应该覆盖 DbContext 上的种子方法而不是迁移。
-
“授权”角色可以达到相同的目的,但适合现有的安全模型(这意味着您不必为了限制对操作的访问而跳槽)。回复:您当前的问题,让框架为您处理帐户设置。
标签: c# asp.net asp.net-mvc entity-framework-6 asp.net-identity-3