2014-12-02 76 views
14

我通過複製VS 2013模板中的代碼在我的MVC應用程序中實現了ASP.NET身份。基本的事情是工作,但我不能讓重置密碼工作。當我顯示「忘記密碼」頁面時,會生成一個包含令牌的電子郵件。此標記方法的返回:使用ASP.NET身份重置密碼令牌無效

UserManager.GeneratePasswordResetTokenAsync(user.Id) 

當我點擊鏈接重設密碼的形式公開,讓用戶輸入他們的電子郵件地址和新密碼。然後調用更改密碼功能由:

UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); 

這對我來說很好,但結果始終是「無效令牌」,我不明白這是爲什麼。

有沒有人有一個想法,爲什麼它不工作?而地獄是什麼存儲的令牌?我想這一定是在某處周圍AspNetUsers表的數據庫...

回答

23

在ASP.NET身份通過UserManager生成的令牌通常包含在作爲查詢字符串傳遞會改成「」「+」字符(一個空格)在URL中。在您的ResetPassword的ActionResult替換 「」 與 「+」 是這樣的:

var code = model.Code.Replace(" ", "+"); 
//And then change the following line 
UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); 
//To this one so it uses the code(spaces replaced with "+") instead of model.Code 
UserManager.ResetPasswordAsync(user.Id, code, model.Password); 

這應該做的伎倆。 我有同樣的問題,並找到答案here

+2

對我來說,當其他答案中描述的UrlEncode/Decode沒有。 – 2016-10-21 15:41:18

+1

我很高興它爲你工作阿德里安:) – Mansoor 2016-10-23 15:34:57

+0

我也是同樣的問題,我不能在代碼的最後一端'==',所以如何處理這個代碼發送通過查詢字符串在郵件和IM也嘗試使用此WebUtility.UrlEncode(代碼)發送郵件並獲取WebUtility.UrDecode(Model.code)的時間,但仍然收到無效令牌的問題和結束。 – coderwill 2017-04-10 12:18:36

24

只是想補充說,HTML編碼/解碼之外的最常見問題是您的數據庫中的用戶條目可能缺少SecurityStamp。 ASP.NET標識中存在一個錯誤,其中一個函數在創建標記時將其設置爲空,而另一個函數在驗證標記時檢查空字符串。

如果您的SecurityStamp爲空或空字符串,這將導致無效令牌問題。

+1

這是我的問題 - 非常感謝! – 2016-08-12 11:40:37

+1

這也是我的問題。我只是用一個隨機字符串更新了空值,它看起來很開心!許多咒罵和憤怒分散。我在你的債務。 – Shawson 2017-01-25 14:53:46

+1

非常感謝! – 2017-02-04 02:29:24

0

在我的情況下,這是因爲數據庫中的數據不正確地從另一個數據庫導入。 SecurityStamp字段爲空,所以我得到了無效的令牌錯誤。

+0

你是如何解決它的? – Richard77 2016-11-14 17:47:36

+0

刪除了該特定表的數據導入,而是使用UserManager從舊數據庫創建用戶。 – 2016-11-15 08:46:45

+0

字面上我的答案的副本... – 2017-02-14 20:13:59

相關問題