ASP.Net Identity重置网站和web api的密码

时间:2018-01-28 06:25:47

标签: asp.net asp.net-web-api asp.net-identity

我们有两种不同的方式让人们执行忘记密码: 1.通过网站 - mywebsite.com/account/forgotpassword 2.通过我们的应用程序 - 单击“忘记密码”将用户电子邮件地址传递给我们的asp.net web api,后者又创建代码并发送电子邮件。

点击电子邮件中的链接会显示正确的页面,我们可以在其中输入电子邮件和新密码。使用选项1重置密码时,它可以正常工作。使用选项2会产生无效的令牌错误。网站和网络API都位于同一台服务器上。

这是Web api代码:

    var user = await UserManager.FindByEmailAsync(email);            
    var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);

    var callbackUrl = $"/Account/ResetPassword?userId={user.Id}&code={code}";            
    var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Content/emails/ResetPassword.html");

    var body = GenerateEmailBody(user);
    await UserManager.SendEmailAsync(user.Id, "Reset Password", body);

这是网站代码

    var user = await UserManager.FindByEmailAsync(model.Email);
    if (user == null)// || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
    {
        // Don't reveal that the user does not exist or is not confirmed
        return View("ForgotPasswordConfirmation");
    }

    // Send an email with this link
    string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
    var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
    var body = GenerateEmailBody(user);
    await UserManager.SendEmailAsync(user.Id, "Reset Password", body);

我验证了UserTokenProvider在两者中都是相同的。

 manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("IdentityStuff"));

我读到MachineKey会导致此问题,除非我们只使用一台服务器。

值得一提的另一条信息是,当网站创建时,它没有添加标识。这是一个想法。网络API以身份开始。

1 个答案:

答案 0 :(得分:0)

为清楚起见,我想我会回答我的问题。

我没有网站和api中都有重置逻辑,而是让网站和我们的应用程序都调用api来重置密码。

我确实做了,但是在使用负载平衡器时遇到了另一个问题。由于一台服务器可能会创建用于重置的代码,而另一台服务器可能会对该链接做出响应,因此我们遇到了同样的问题。

要解决此问题,我有一个DNS条目,该条目始终指向用于创建代码以及实际重置密码的单个服务器。这样就消除了获得无效令牌的问题。

HTH。