您不能缩短 DpapiDataProtectionProvider 输出,但您可以例如生成一个 GUID(或其他一些随机字符串),将其替换为 callbackUrl 并将其与 DpapiDataProtectionProvider 代码一起保存在您的数据库中。然后,在 ResetPassword 方法中,使用提供的 GUID 从数据库中检索原始受保护代码并调用 ResetPasswordAsync。
它可能看起来像这样(伪代码):
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
string originalCode = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
string code = Guid.NewGuid().ToString(); // or other short code
/*
Save to database code and originalCode
*/
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
return RedirectToAction("ForgotPasswordConfirmation", "Account");
}
还有你的 ResetPassword
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
/*
retreive originalCode from database by using model.Code
*/
var originalCode = from_db;
var result = await UserManager.ResetPasswordAsync(user.Id, originalCode, model.Password);
AddErrors(result);
return View();
}
另一种方法是实现 IDataProtector 并使用其他一些算法来保护和取消保护长度较短的数据。