我在使用UserManager.CheckPassword(...)
实施自定义IUser
时遇到问题。
我正在使用.net Identity与Owin,创建我自己的IUser
和IUserStore
实现。
对于商店,我只使用可选的电子邮件和密码存储。
此处可以看到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()
方法如何在不知道要查看的情况下检查自定义实现的密码。
我做错了什么?
答案 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,所以当然会失败..