我们有两种不同的方式让人们执行忘记密码: 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以身份开始。
答案 0 :(得分:0)
为清楚起见,我想我会回答我的问题。
我没有网站和api中都有重置逻辑,而是让网站和我们的应用程序都调用api来重置密码。
我确实做了,但是在使用负载平衡器时遇到了另一个问题。由于一台服务器可能会创建用于重置的代码,而另一台服务器可能会对该链接做出响应,因此我们遇到了同样的问题。
要解决此问题,我有一个DNS条目,该条目始终指向用于创建代码以及实际重置密码的单个服务器。这样就消除了获得无效令牌的问题。
HTH。