我们有两种不同的方式让人们执行忘记密码:
1、通过网站-我的网站。com/帐户/放弃密码
通过我们的应用程序-单击“忘记密码”将用户的电子邮件地址传递给我们的asp。net web api创建代码并发送电子邮件。
单击电子邮件中的链接将显示正确的页面,我们可以在其中输入电子邮件和新密码。使用选项1重置密码时,效果良好。使用选项2会出现无效的令牌错误。网站和web 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可能会导致此问题,除非我们只使用一台服务器。
另一条值得一提的信息是,网站创建时,没有添加标识。这是事后的想法。web api从identity开始。