如果我的UserName是基于电子邮件的,为什么UserManager.Find()返回null?

时间:2014-01-11 01:13:55

标签: asp.net-mvc asp.net-identity

我正在尝试在AspNet.Identity中为MVC5实现基于电子邮件地址的用户名,但我遇到了UserManager找到我的用户的问题。

public UserManager<ApplicationUser> UserManager { get; private set; }

public AccountController(UserManager<ApplicationUser> userManager)
{
    UserManager = userManager;
    UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}

在我的登录帖子方法中:

var user = await UserManager.FindAsync(model.UserName, model.Password);

用户为空。

我使用错误的方法通过用户名和密码查找我的用户吗?

即使我使用

var db = new ApplicationDBContext();
var user = db.Users.Find(model.UserName);

var db = new ApplicationDBContext();
var user = db.Users.FirstOrDefault(u => u.UserName == model.UserName);

我得到一个空

更新

看起来我变空了,因为我试图播种的用户没有播种。谁知道为什么?

这是我在Configuration.cs(迁移)中的用户的种子:

var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var users = new List<ApplicationUser>()
{
    new ApplicationUser { UserName = "batman@email.com", IsActive = true },
    new ApplicationUser { UserName = "superman@email.com", IsActive = true },
    new ApplicationUser { UserName = "wonderwoman@email.com", IsActive = false }
};
users.ForEach(i => manager.Create(i, "password"));

如果我使用非电子邮件UserNames为用户播种,则播种没有问题:

new ApplicationUser { UserName = "batman", IsActive = true },
new ApplicationUser { UserName = "superman", IsActive = true },
new ApplicationUser { UserName = "wonderwoman", IsActive = false }

2 个答案:

答案 0 :(得分:1)

知道了。我需要更改种子中的验证器:

var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = false
};
var users = new List<ApplicationUser>()
{
    new ApplicationUser { UserName = "batman@email.com", IsActive = true },
    new ApplicationUser { UserName = "superman@email.com", IsActive = true },
    new ApplicationUser { UserName = "wonderwoman@email.com", IsActive = false }
};
users.ForEach(i => manager.Create(i, "December 2013"));

在此之后,我能够播放基于电子邮件的UserNames。

我将此保留在我的AccountController中以添加用户:

public AccountController(UserManager<ApplicationUser> userManager)
{
    UserManager = userManager;
    UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}

答案 1 :(得分:0)

确认您已添加数据库初始化策略或执行手动更新。

e.g。 [数据库初始化策略]

Database.SetInitializer<ApplicationDbContext>(new System.Data.Entity.MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());