手動驗證 ASP.NET Identity 中的密碼重置令牌
我想手動驗證 ASP.NET Identity 2.0 中的密碼重置令牌。我正在嘗試創建自己的版本,
UserManager.ResetPasswordAsync(string userId, string token, string newPassword)而IdentityUser不是userId這樣:UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword)不確定我這樣做是否正確,但在這裡我試圖驗證在前面的步驟中通過電子郵件發送給使用者的程式碼。我沒有修改將電子郵件發送給使用者並生成程式碼的程式碼/令牌。我假設這是正確的呼叫方法,但
purpose參數不正確。(我嘗試傳遞“ASP.NET Identity”但沒有骰子。)if (await userManager.UserTokenProvider.ValidateAsync(purpose: "?", token: code, manager: userManager, user: user)) { return IdentityResult.Success; } else { return new IdentityResult("Invalid code."); }如果有人可以向我提供開箱即用的工作原理的詳細資訊,或者將我指向 Microsoft 的原始碼
UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword),將不勝感激!
根據位於以下位置的 Codeplex 儲存庫,Microsoft.AspNet.Identity 的程式碼似乎尚未開源:
https://aspnetidentity.codeplex.com/SourceControl/latest#Readme.markdown
目前,ASP.NET Identity 框架程式碼未公開,因此不會在本網站上發布。但是,我們計劃改變這一點,一旦我們能夠做到,程式碼將在這個儲存庫中發布。
但是我確實發現這可能是基於調試符號的 UserManager 的來源:
我還發現這些文章可能會有所幫助:
我通過將目的設置為“ResetPassword”克服了我的問題。
下面是最終結果的片段,以防有人想做類似的事情。這是我
ApplicationUserManager班上的一種方法。但是要意識到,Microsoft 實現的某些異常處理失去或未本地化,因為它們的程式碼中使用的某些私有變數、方法和資源是不可訪問的。不幸的是,他們沒有保護這些東西,這樣我就可以得到它。特別是缺少的ThrowIfDisposed方法呼叫對我來說很有趣(和集市)。顯然,他們在處理實例後預期方法呼叫,以便提供更友好的錯誤消息並避免意外。public async Task<IdentityResult> ResetPasswordAsync(IdentityUser user, string token, string newPassword) { if (user == null) { throw new ArgumentNullException("user"); } // Make sure the token is valid and the stamp matches. if (!await UserTokenProvider.ValidateAsync("ResetPassword", token, this, user)) { return IdentityResult.Failed("Invalid token."); } // Make sure the new password is valid. var result = await PasswordValidator.ValidateAsync(newPassword) .ConfigureAwait(false); if (!result.Succeeded) { return result; } // Update the password hash and invalidate the current security stamp. user.PasswordHash = PasswordHasher.HashPassword(newPassword); user.SecurityStamp = Guid.NewGuid().ToString(); // Save the user and return the outcome. return await UpdateAsync(user).ConfigureAwait(false); }