看来这两个功能在 WebMatrix 代码中有一组帮助函数和模式才能开始。但是,没有控制器方法或视图来完成它,因此您必须自己实现。
是否有任何示例可以让我将此代码复制到我的应用程序中?我正在寻找一些东西:
- 生成忘记密码电子邮件
- 生成确认电子邮件
- 忘记密码视图+控制器方法
- 重新发送确认电子邮件视图 + 控制器方法
看来这两个功能在 WebMatrix 代码中有一组帮助函数和模式才能开始。但是,没有控制器方法或视图来完成它,因此您必须自己实现。
是否有任何示例可以让我将此代码复制到我的应用程序中?我正在寻找一些东西:
忘记密码功能
前几天,我试图在 asp.net MVC 4 中创建一个“忘记密码功能”。我在 Google 上搜索进出,但找不到最佳解决方案。我终于找到了出路。15个简单的步骤
第 1 部分通过电子邮件发送密码重置信息
第1 步• 创建Mvc 4 c# Internet 应用程序模板:) (将自动生成帐户和家庭控制器)• 构建并运行您的项目。注册并登录。(将生成简单的成员表)
Everything working fine?
第 2 步 • 哎呀!他们在注册时不会询问我们的电子邮件 ID!为了向用户发送密码令牌,我们需要他们的电子邮件 ID!因此,让我们在数据库中进行一些更改,转到服务器资源管理器!(如果你找不到它,你可以按 Ctrl + alt + S) • 展开“数据连接”,你会看到几个表格。打开用户配置文件表。添加以下列:
第 3 步 • 现在转到解决方案资源管理器...模型...帐户模型...注册模型 • 为电子邮件 ID 和详细信息添加这两个属性
//new properties
[Required]
[Display(Name="Email ID")]
public string EmailId { get; set; }
[Required]
[Display(Name = "About Yourself")]
public string Details { get; set; }
第 4 步 • 现在转到解决方案资源管理器...视图 ... 帐户视图 ... Register.cshtml 视图 • 添加这两个属性以允许用户输入电子邮件 ID 和其他详细信息。
第 5 步 • 现在转到解决方案资源管理器...控制器 ... 帐户控制器 ... 注册控制器操作方法的发布版本 • 添加这些属性以允许用户输入电子邮件 ID 和其他详细信息。突出显示更改。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { EmailId = model.EmailId, Details = model.Details});
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
为什么我们不再次构建并运行我们的项目?注册并填写详细信息。现在您将被要求指定电子邮件地址。添加这些属性以允许用户输入电子邮件 ID 和其他详细信息。
转到服务器资源管理器并右键单击用户配置文件表并选择“显示表数据”U可以查看您输入的详细信息以进行验证。
第 6 步 • 现在让我们实现密码重置功能 转到帐户控制器并创建以下控制器操作方法 (GET)
[AllowAnonymous]
public ActionResult ForgotPassword()
{
return View();
}
• (POST)
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ForgotPassword(string UserName)
{
//check user existance
var user = Membership.GetUser(UserName);
if (user == null)
{
TempData["Message"] = "User Not exist.";
}
else
{
//generate password token
var token = WebSecurity.GeneratePasswordResetToken(UserName);
//create url with above token
var resetLink = "<a href='" + Url.Action("ResetPassword", "Account", new { un = UserName, rt = token }, "http") + "'>Reset Password</a>";
//get user emailid
UsersContext db = new UsersContext();
var emailid = (from i in db.UserProfiles
where i.UserName == UserName
select i.EmailId).FirstOrDefault();
//send mail
string subject = "Password Reset Token";
string body = "<b>Please find the Password Reset Token</b><br/>" + resetLink; //edit it
try
{
SendEMail(emailid, subject, body);
TempData["Message"] = "Mail Sent.";
}
catch (Exception ex)
{
TempData["Message"] = "Error occured while sending email." + ex.Message;
}
//only for testing
TempData["Message"] = resetLink;
}
return View();
}
• GET 控制器动作只返回视图。• POST 控制器操作:接收用户名 验证其存在 生成密码重置令牌 构建要通过电子邮件发送的 URL。
步骤 7 • 右键单击忘记密码操作方法并添加视图 视图页面的代码如下
@{
ViewBag.Title = "Forgot Password";
}
<h2>Forgot Password</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<fieldset>
<legend>Forgot Password Form</legend>
<ol>
<li>
@Html.Label("User Name", new { @for = "UserName" })
@Html.TextBox("UserName")
<span style="color:red;">@TempData["Message"]</span>
</li>
</ol>
<input type="submit" value="Recover" />
</fieldset>
}
• 查看页面将显示一个文本框,用户可以在其中输入用户名。
步骤 8 • 现在转到解决方案资源管理器...模型...帐户模型...用户配置文件视图模型。更改已突出显示
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
//new properties
public string EmailId { get; set; }
public string Details { get; set; }
}
第 9 步 • 现在转到解决方案资源管理器...视图...帐户...登录视图。现在我们可以看到一个选项来恢复他的密码,以防他忘记密码。
<ul>
<li>
@Html.ActionLink("Register", "Register") if you don't have an account.
</li>
<li>
@Html.ActionLink("Forgot Password", "ForgotPassword") if you want to recover your password.
</li>
</ul>
第 2 部分从 URL 接收密码重置信息
步骤 1 • 转到解决方案资源管理器...控制器...帐户控制器...创建新的重置密码操作方法 • 此方法接受来自 URL 的“un”(用户名)和“rt”(密码重置令牌) .
[AllowAnonymous]
public ActionResult ResetPassword(string un, string rt)
{
UsersContext db = new UsersContext();
//TODO: Check the un and rt matching and then perform following
//get userid of received username
var userid = (from i in db.UserProfiles
where i.UserName == un
select i.UserId).FirstOrDefault();
//check userid and token matches
bool any = (from j in db.webpages_Memberships
where (j.UserId == userid)
&& (j.PasswordVerificationToken == rt)
//&& (j.PasswordVerificationTokenExpirationDate < DateTime.Now)
select j).Any();
if (any == true)
{
//generate random password
string newpassword = GenerateRandomPassword(6);
//reset password
bool response = WebSecurity.ResetPassword(rt, newpassword);
if (response == true)
{
//get user emailid to send password
var emailid = (from i in db.UserProfiles
where i.UserName == un
select i.EmailId).FirstOrDefault();
//send email
string subject = "New Password";
string body = "<b>Please find the New Password</b><br/>" + newpassword; //edit it
try
{
SendEMail(emailid, subject, body);
TempData["Message"] = "Mail Sent.";
}
catch (Exception ex)
{
TempData["Message"] = "Error occured while sending email." + ex.Message;
}
//display message
TempData["Message"] = "Success! Check email we sent. Your New Password Is " + newpassword;
}
else
{
TempData["Message"] = "Hey, avoid random request on this page.";
}
}
else
{
TempData["Message"] = "Username and token not maching.";
}
return View();
}
步骤 2 • 右键点击重置密码操作方法并添加视图 视图页面的代码如下
@{
ViewBag.Title = "ResetPassword";
}
<h2>Password Mailed :) </h2>
步骤 3 • 转到解决方案资源管理器...模型...帐户模型...进行以下更改。• 我们创建一个UserProfile DB 模型的实例并将db.webpages_Memberships 实现为DbSet。使用'webpages_Memberships' 作为模型。
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<webpages_Membership> webpages_Memberships { get; set; }
}
[Table("webpages_Membership")]
public class webpages_Membership
{
[Key]
public int UserId { get; set; }
public DateTime CreateDate { get; set; }
public string ConfirmationToken { get; set; }
public bool IsConfirmed { get; set; }
public DateTime LastPasswordFailureDate { get; set; }
public int PasswordFailuresSinceLastSuccess { get; set; }
public string Password { get; set; }
public DateTime PasswordChangeDate { get; set; }
public string PasswordSalt { get; set; }
public string PasswordVerificationToken { get; set; }
public DateTime PasswordVerificationTokenExpirationDate { get; set; }
}
第 4 步 • 将随机密码生成功能添加到帐户控制器 • 调用此方法时,将为用户生成随机密码
private string GenerateRandomPassword(int length)
{
string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-*&#+";
char[] chars = new char[length];
Random rd = new Random();
for (int i = 0; i < length; i++)
{
chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
}
return new string(chars);
}
步骤 5 • 在帐户控制器中添加发送电子邮件功能。• 当用户单击忘记密码表单上的恢复按钮时,此功能将向用户发送第一封邮件。第一封邮件包含重置密码链接。当用户点击链接时。用户将被重定向到重置密码页面。新密码将再次邮寄给用户。• 您需要输入您的电子邮件地址代替 XXXXX@gmail.com 并输入您的密码。
private void SendEMail(string emailid, string subject, string body)
{
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
client.EnableSsl = true;
client.Host = "smtp.gmail.com";
client.Port = 587;
System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("xxxxx@gmail.com", "password");
client.UseDefaultCredentials = false;
client.Credentials = credentials;
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.From = new MailAddress("xxxxx@gmail.com");
msg.To.Add(new MailAddress(emailid));
msg.Subject = subject;
msg.IsBodyHtml = true;
msg.Body = body;
client.Send(msg);
}