使用提供的模板. Net OWIN MVC应用程序。我得到一个AccountController与一个ForgotPassword方法调用…
var code = await manager.GeneratePasswordResetTokenAsync(user.Id);
经过一些研究,我发现代码是由OWIN安全保护,使用DpapiDataProtectionProvider Protect方法。这很好。
让我失望的是,返回的代码是超长的,我不确定我是否做错了,或者是否有一些我可以改变来缩短它。需要注意的一件重要的事情是,我正在用以下代码手动设置IDataProtector…
//ctor
public MyUserManager(IUserStore<MyUser, int> store) : base(store)
{
var provider = new DpapiDataProtectionProvider("MvcApplication");
UserTokenProvider = new DataProtectorTokenProvider<MyUser, int>(provider.Create("EmailConfirmation"));
}
任何帮助都将非常感激!
您不能缩短DpapiDataProtectionProvider输出,但您可以例如生成GUID(或其他一些随机字符串),在callbackUrl中替换它,并将其保存在您的DB中与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并使用一些其他算法来保护和取消保护长度较短的数据