0

我正在使用ASP.NET身份验证MVC5中的成员身份,并且有一个供admin用户管理用户和角色的页面。我试图让管理员更改任何其他用户的密码,如果他需要这样做。我使用这个代码来执行任务:UserManager.AddPassword不能按预期工作

userManager.RemovePassword(userId); 
userManager.AddPassword(userId, newPassword); 

似乎很简单,但是当我试图用我刚刚创建,我不能将新密码登录;我收到无效的密码信息。

我试图通过试图找出如何散列密码,进一步研究这个问题,并发现了这一点:

string hashed = userManager.PasswordHasher.HashPassword("some password"); 

首先,我假设这个密码散列器就是AddPassword()内部使用。其次,我注意到每次运行HashPassword('some password')时,都会得到一个完全不同的散列给我。

我不明白这一点...

+0

HashPassword使用salt值来随机化散列,这就是为什么每次使用所有HashPassword时都会得到不同的值。盐值使得攻击者无法使用字典攻击,只要他们能够查看哈希密码来找出未经哈希的版本。 验证密码时再次使用此salt值。 – 2014-10-08 04:26:21

+0

@ErikFunkenbusch好吧,够用了,但是我不能用我传递给'AddPassword()'的密码登录? – Matt 2014-10-08 12:07:26

回答

-1

好吧,我发现这个问题,这是因为在AccountController以下行的代码:

var user = await UserManager.FindAsync(model.Email, model.Password); 

这里发生的事情是,FindAsync要求一个用户名,而不是一个电子邮件并与我正在测试的用户,用户名和电子邮件是不同的。

我想知道,如果可能我在Login行动改变了代码的电子邮件地址通过,不记得......所以我创建了一个新的MVC5项目和使用的NuGet来更新到最新版本..好吧,它看起来像是一个bug!是的,默认实现实际上将电子邮件地址传递给FindAsync。显然这是因为当你注册一个新用户时,它将用户名设置为电子邮件地址(因此它们是相同的并且无关紧要)。但是,他们没有考虑到有人可能想要更改用户名!

解决!