簡體   English   中英

盡管使用UserManager擴展方法,FindAsync仍返回null

[英]FindAsync returns null despite UserManager extension method

我目前正在使用這個出色的指南,目的是將使用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,我是否需要編寫不同的擴展名?

感謝您的任何幫助,您可以提供。

以下是為新的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代碼。

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成員資格信息的上下文,它就像一個魅力。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM