asp.net mvc 忘记密码 代码实现
时间: 2023-07-25 11:06:23 浏览: 243
以下是一个简单的 ASP.NET MVC 忘记密码功能的实现:
1. 创建 ForgotPassword 视图
在 Views 文件夹中创建 ForgotPassword.cshtml 视图,并在视图中添加一个表单,用于接收用户输入的电子邮件地址。
```
@model ForgotPasswordViewModel
@using (Html.BeginForm("ForgotPassword", "Account", FormMethod.Post, new { @class = "form-horizontal" }))
{
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Send Password Reset Link</button>
</div>
</div>
}
```
2. 创建 ForgotPasswordViewModel
在 Models 文件夹中创建 ForgotPasswordViewModel 类,用于存储用户输入的电子邮件地址。
```
public class ForgotPasswordViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
}
```
3. 创建 ForgotPasswordAction
在 AccountController 中创建 ForgotPasswordAction,用于处理用户发送密码重置链接的请求。
```
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByEmailAsync(model.Email);
if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
{
// 如果用户不存在或未确认电子邮件,则不显示该视图,以防止揭示用户信息
return View("ForgotPasswordConfirmation");
}
// 生成密码重置令牌并将其发送给用户
var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking here: <a href=\"" + callbackUrl + "\">link</a>");
return RedirectToAction("ForgotPasswordConfirmation", "Account");
}
// 如果我们到了这里,那么模型状态不正确,重新显示表单
return View(model);
}
```
4. 创建 ForgotPasswordConfirmation 视图
在 Views 文件夹中创建 ForgotPasswordConfirmation.cshtml 视图,用于显示“已发送密码重置链接”的消息。
```
<p>Please check your email to reset your password.</p>
```
5. 创建 ResetPassword 视图
在 Views 文件夹中创建 ResetPassword.cshtml 视图,用于让用户输入新密码。
```
@model ResetPasswordViewModel
@using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post, new { @class = "form-horizontal" }))
{
@Html.HiddenFor(m => m.Code)
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control", @readonly = "readonly" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Reset Password</button>
</div>
</div>
}
```
6. 创建 ResetPasswordViewModel
在 Models 文件夹中创建 ResetPasswordViewModel,用于存储用户输入的新密码。
```
public class ResetPasswordViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("Password", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public string Code { get; set; }
}
```
7. 创建 ResetPasswordAction
在 AccountController 中创建 ResetPasswordAction,用于处理用户重置密码的请求。
```
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await UserManager.FindByEmailAsync(model.Email);
if (user == null)
{
// 不显示该视图,以防止揭示用户信息
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
if (result.Succeeded)
{
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
return View();
}
```
8. 创建 ResetPasswordConfirmation 视图
在 Views 文件夹中创建 ResetPasswordConfirmation.cshtml 视图,用于显示“密码已重置”的消息。
```
<p>Your password has been reset.</p>
```
完成上述步骤后,ASP.NET MVC 忘记密码功能就已经实现了。
阅读全文