尽管使用UserManager扩展方法,FindAsync仍返回null

时间:2013-12-27 21:02:33

标签: c# asp.net-mvc-5 asp.net-identity

我目前正在使用这本出色的指南,目的是将使用SQL成员身份验证的现有Web应用程序迁移到ASP.NET身份验证:

http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity

由于差异我没有使用Web窗体项目,所以我已经调整它以使用MVC 5项目。这是我的UserManager类,它应该检查SQL成员资格密码并在必要时更新它们(详见上面的链接):

public class MyUserManager : UserManager<ApplicationUser>
{
    public MyUserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        this.PasswordHasher = new SQLPasswordHasher();
    }
    public class SQLPasswordHasher : PasswordHasher
    {
        public override string HashPassword(string password)
        {
            return base.HashPassword(password);
        }

        public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
        {
            string[] passwordProperties = hashedPassword.Split('|');
[SNIP]

问题 / Account / Login方法似乎没有使用PasswordHasher扩展名。这是代码(直接来自MVC 5模板,尽管UserManager对象是上面MyUserManager类的一个实例):

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
[SNIP]

它不会进行身份验证。我想我不是唯一一个试图做这项工作的人。有什么指针吗?对于MVC 5,我是否需要编写不同的扩展名?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

以下是为新的MVC 5项目设置的方法:

<强> IdentityModels.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("ApplicationServices")
    {
    }
}

public class MyUserManager : UserManager<ApplicationUser>
{
    public MyUserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        this.PasswordHasher = new SQLPasswordHasher();
    }
    public class SQLPasswordHasher : PasswordHasher
[etc.]

可以找到SQLPasswordHasher代码here

<强> AccountController.cs

public class AccountController : Controller
{
    public AccountController()
        : this(new MyUserManager())
    {
    }

    public AccountController(MyUserManager userManager)
    {
        UserManager = userManager;
    }

    public MyUserManager UserManager { get; private set; }

[etc.]

其余部分与上面提到的博客和/或默认MVC 5模板中显示的完全相同。一旦连接到具有SQL成员资格信息的上下文,它就像一个魅力。希望这会有所帮助。