我使用ASP.NET Identity作为MVC5的成员资格,并为admin用户提供了一个页面来管理用户和角色。我试图允许管理员更改任何其他用户的密码,如果他需要这样做。我正在使用此代码执行任务:
userManager.RemovePassword(userId);
userManager.AddPassword(userId, newPassword);
看起来很简单,但当我尝试使用我刚创建的新密码登录时,我无法做到;我收到了无效的密码信息。
我试图通过尝试查找密码的密码并发现这一点来进一步调查此问题:
string hashed = userManager.PasswordHasher.HashPassword("some password");
首先,我假设密码hasher是AddPassword()
内部使用的密码。
其次,我注意到每次运行HashPassword('some password')
时,我都会收到一个完全不同的哈希值。
我不明白......
答案 0 :(得分:-1)
好吧,我发现了问题,因为AccountController
中有以下代码行:
var user = await UserManager.FindAsync(model.Email, model.Password);
此处发生的是FindAsync
需要用户名,而不是电子邮件以及我正在测试的用户,用户名和电子邮件是不同的。
我想知道是否可能更改了Login
操作中的代码以传递电子邮件地址并且不记得...所以我创建了一个新的MVC5项目并且用Nuget更新到最新版本......好吧,它看起来像是一个bug!是的,默认实现实际上将电子邮件地址传递给FindAsync
。显然这是因为当您注册新用户时,它会将用户名设置为电子邮件地址(因此它们是相同的,并不重要)。但是,他们没有考虑到有人可能想要更改用户名的事实!
解决!