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.
我们有两种不同的方式供人们执行忘记密码的操作: 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.