asp.net MVC 5 - 为什么我无法以种子用户身份登录?



我正在开发一个新的ASP.NET MVC项目,使用存储在数据库中的各个帐户进行身份验证。这是我的类,每次测试时都会用样本数据为数据库种子:

public class DevelopmentInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
{
    protected override void Seed(ApplicationDbContext context)
    {
        base.Seed(context);
        var applicationUserManager = new ApplicationUserManager(new UserStore<ApplicationUser>(context));
        var sampleUserOne = new ApplicationUser { UserName = "SampleUser", Email = "sample@example.com" };
        var result = applicationUserManager.Create(sampleUserOne, "aaaaaa");
        if (!result.Succeeded) 
            throw new Exception();
        context.SaveChanges();
    }
}

Login操作与模板中的一样:

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.Email, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }
        // If we got this far, something failed, redisplay form
        return View(model);
    }

问题的描述很简单:尝试使用种子用户的凭据登录失败

具体来说,FindAsync方法返回null,即使用户存在于数据库中——FindByEmailAsync确实找到了种子用户。

然而,创建一个新帐户是可行的,并允许我登录。

为什么我不能作为种子用户登录,即使我可以注册一个新帐户并使用它登录

我怀疑这与密码的哈希方式有关,但我不知道如何确认这一点。

我的账户播种错误了吗?我不应该在Seed方法中创建单独的ApplicationUserManager吗?如果没有,我应该如何获得一个才能呼叫Create?在我的帐户被锁定或用户在部署的应用程序中被锁定之前,我正在努力了解新系统是如何工作的。

以下代码:

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

需要传入userName,而不是电子邮件地址。

这个简单的改变应该能解决问题:

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

如果您看到PasswordSignInAsync的定义,它需要用户名字符串,而不是电子邮件。登录用户界面请求电子邮件的原因可能是因为自动生成的代码,其中电子邮件将等于控制器内的用户名。

相关内容

  • 没有找到相关文章

最新更新