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。顯然這是因爲當你註冊一個新用戶時,它將用戶名設置爲電子郵件地址(因此它們是相同的並且無關緊要)。但是,他們沒有考慮到有人可能想要更改用戶名!

解決!