2

使用为 Asp.Net OWIN MVC 应用程序提供的模板。我得到一个带有 ForgotPassword 方法的 AccountController,它调用...

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")); 
}

任何帮助将不胜感激!

4

1 回答 1

0

您不能缩短 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 并使用其他一些算法来保护和取消保护长度较短的数据。

于 2015-06-08T13:07:26.510 回答