自定义IUser实现 - 验证密码

时间:2015-12-30 07:26:01

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

我在使用UserManager.CheckPassword(...)实施自定义IUser时遇到问题。

我正在使用.net Identity与Owin,创建我自己的IUserIUserStore实现。

对于商店,我只使用可选的电子邮件和密码存储。

此处可以看到IUser实现,其基本字段为:

public class RegisteredUser : IUser<string>
{
    public RegisteredUser()
    {
        Id = Guid.NewGuid().ToString();
    }

    public string Id { get; }

    public string UserName { get; set; }

    public string PasswordHash { get; set; }

    public string Email { get; set; }

    public bool EmailConfirmed { get; set; }
}

登录时验证用户时会出现问题。 我无法使用SignInManager.PasswordSignIn(...),因为我的商店没有实现LockoutStore。

相反,我使用UserManager.CheckPassword(...),但这会引发FormatException,说:

  

输入不是有效的Base-64字符串...

UserSignInManager manager = HttpContext.GetOwinContext().Get<UserSignInManager>();

RegisteredUser user = manager.UserManager.FindByEmail(model.Email);
if (user != null && manager.UserManager.CheckPassword(user, model.Password))
{
    manager.SignIn(user, model.RememberMe, model.RememberMe);
    return RedirectToAction("UserProfile");
}

考虑到这一点,我也无法理解CheckPassword()方法如何在不知道要查看的情况下检查自定义实现的密码。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

好吧 - 代表我的Brainfart ..

UserManager可以检查密码,因为UserStore实现了以下方法

public Task<string> GetPasswordHashAsync(RegisteredUser user)
{
    string passwordHash = AWSUser.GetPasswordHash(user.Id);
    return Task.FromResult(passwordHash);

}

问题出在AWSUser类中,该类具有以下方法

public static string GetPasswordHash(string id)
{
    return tblUsers.Find(u => u.Id.Equals(id)).Id;
}

因为我错误地返回了ID,所以当然会失败..