ASP.Net 使用网站和 web 身份重置密码 api

ASP.Net Identity reset password with website and web api

我们有两种不同的方式供人们执行忘记密码的操作: 1. 通过网站-mywebsite.com/account/forgotpassword 2. 通过我们的应用程序 - 单击 "Forgot Password" 将用户电子邮件地址传递到我们的 asp.net 网站 api,然后创建代码并发送电子邮件。

点击电子邮件中的 link 会弹出正确的页面,我们可以在其中输入电子邮件和新密码。使用选项 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 始于身份。

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

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

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

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

HTH.