尝试获取密码重置功能。这将适用于没有也无法登录系统的用户。我觉得我很接近,但感觉不对:
我有一个ResetPassword方法/视图...它只是询问用户的电子邮件地址,不向用户确认帐户,但如果存在,则发送带有链接+令牌的电子邮件。一切正常。
下一部分是我的问题所在......我通过此方法收到密码令牌(通过点击用户的电子邮件链接):
[HttpGet]
public ActionResult ReceiveResetToken(string token)
{
try
{
if (!String.IsNullOrEmpty(token))
{
var username = (from u in db.Users
where u.Userid == WebSecurity.GetUserIdFromPasswordResetToken(token)
select u.Email).ToString();
if (!String.IsNullOrEmpty(username))
{
WebSecurity.ConfirmAccount(token);
}
}
RedirectToAction("Index", "Home");
}
catch (Exception)
{
throw;
}
}
我在这里遗漏了一些明显的东西。该方法不完整,因为我一直在重新考虑它...获取用户名,确认帐户,以某种方式登录他们而不知道他们的密码是什么,重定向到更改密码页面?感觉不对。
那么我想也许可以将带有ViewBag的隐藏用户名传递给更改对话...也感觉不对。我想要一种更优雅的方法,接收令牌,询问用户名以获取新密码,更新数据库并登录。接收密码重置令牌的模式是什么?
编辑-------因此,当我继续寻找答案时,我偶然发现了这个小宝石。显然,有一个WebSecurity.ResetPassword方法接受令牌和新密码。这感觉就像正确的道路,无需担心登录,只需更改它并重定向登录......我将完成代码并发布一个解决方案,因为这似乎是一个流行的,往往没有答案的问题。 / p>
如果有人能证实我正走在正确的道路上或发布任何关于为这种模式添加优雅的想法
答案 0 :(得分:2)
这是一条正确的道路!
对我来说,
用户发送他的电子邮件,然后我向他发送一个令牌,该令牌生成GUID
并且我passwordResetTokenDate
在用户要求重置时选择日期。 (令牌有效48小时)
在电子邮件中,有一个令牌链接,我给他一个令牌,如果他点击并出现问题,他可以复制粘贴在文本框中的令牌或重新点击链接
当他点击链接时,我会检查令牌和日期,passwordResetTokenDate
如果一切正常,则有两个文本框,用户输入新密码的2倍。
当他保存密码时,我记录了他。
WebSecurity.ResetPassword
做好工作!
这里有一个例子:(我有自定义提供商的自定义websecurity)
[AllowAnonymous]
public ActionResult ForgotMyPassword(string confirmation, string username)
{
username = HttpUtility.UrlDecode(username);
ViewBag.Succeed = false;
SetPasswordViewModel Fmp = new SetPasswordViewModel(username,confirmation);
return View(Fmp);
}
//
// POST: /Account/ForgotMyPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ForgotMyPassword(SetPasswordViewModel model)
{
ViewBag.Succeed = false;
if (ModelState.isValid)
{
ViewBag.Succeed = WebSecurity.ResetPassword(model.UserName, model.PasswordResetToken, model.Password.NewPassword);
}
if (!ViewBag.Succeed)
{
ModelState.AddModelError("","something"); //something
}
return View(model);
}
答案 1 :(得分:1)
这是它应该如何工作(在ASP Security Kit中实现)
答案 2 :(得分:1)
回答我自己的问题以防万一。
WebSecurity.GeneratePasswordResetToken(email, 1440)
生成令牌尚未完全写出来,但我认为这是正确的方法