ASP.NET MVC - reCAPTCHA 和电子邮件确认






4.98/5 (60投票s)
如何在您的 ASP.NET MVC 网站中添加 reCAPTCHA 和电子邮件确认。
引言
ASP.NET MVC 为您提供了一种强大的、基于模式的方式来构建动态网站,它能够清晰地分离关注点,并让您完全控制标记,从而实现轻松愉快的敏捷开发。
ASP.NET MVC 包含许多功能,可实现快速、易于进行测试驱动开发的开发,用于创建使用最新 Web 标准的复杂应用程序。
您也可以从Microsoft Gallery中选择基于 ASP.NET MVC 的现有平台,例如:
- 博客
- CMS
- 电子商务
- 论坛
- 图库
- Wiki
- 还有更多
但是,您可能需要添加到任何 Web 应用程序中的一个方面是**机器人防护和电子邮件完整性**。
那么,如何防止“机器人”(通常用于生成垃圾邮件的自动化程序)滥用,以及如何确保用户在您的 Web 应用程序注册时提供了真实的电子邮件地址呢?
答案是:reCAPTCHA 和电子邮件确认
reCAPTCHA
CAPTCHA 是一种程序,可以判断其用户是人还是计算机。您可能已经见过它们——在 Web 注册表单底部带有扭曲文本的彩色图像。许多网站都使用 CAPTCHA 来防止“机器人”(通常用于生成垃圾邮件的自动化程序)滥用。计算机程序无法像人类一样读取扭曲的文本,因此机器人无法浏览受 CAPTCHA 保护的网站。
步骤 1:下载并获取 reCAPTCHA 密钥
首先访问 reCAPTCHA 网站并注册以获取唯一密钥,然后下载 reCAPTCHA .NET 库。
安全地保存您的公共密钥和私钥。
步骤 2:创建 ASP.NET MVC 3 Web 应用程序
现在,让我们在 Visual Studio 2010 中启动一个新的 ASP.NET MVC 3 Web 应用程序项目。
选择从“Internet 应用程序”模板创建。
步骤 3:Recaptcha
将 Recaptcha DLL 添加为项目的引用。
使用新的密钥修改网站的 *Web.config* 文件,在appSettings
部分下添加我们之前收到的密钥。
ReCaptchaPrivateKey
ReCaptchaPublicKey
步骤 4:更改注册
打开 *Controllers* 文件夹,打开 AccountController 文件,找到Register
方法,添加新的属性
[RecaptchaControlMvc.CaptchaValidatorAttribute]
并将 reCAPTCHA 逻辑添加到您的注册代码中
[HttpPost]
[RecaptchaControlMvc.CaptchaValidatorAttribute]
public ActionResult Register(RegisterModel model, bool captchaValid)
{
if (!captchaValid)
{
ModelState.AddModelError("", "You did not type the verification
word correctly. Please try again.");
}
else
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password,
model.Email, null, null, true, null,
out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("",
ErrorCodeToString(createStatus));
}
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
现在将以下命令放在 *Register.cshtml* 文件中
@Html.Raw(Html.GenerateCaptcha())
运行您的网站并进入注册页面,现在您必须在完成注册之前输入验证码。
电子邮件确认
为了确保用户提供了真实的电子邮件地址,您需要在您的网站中使用电子邮件确认机制。
ASP MVC 为我们完成了一些工作,当用户注册到您的网站时,会分配一个名为 **ProviderUserKey** 的唯一 ID(GUID)属性。
我将使用此值来验证帐户。
步骤 1:使用 SMTP 设置修改 Web.Config
在开始电子邮件确认实现之前,我们需要定义我们的电子邮件设置,为此我使用了我的 Gmail 帐户(仅用于此测试),并在配置标记下方将这些值添加到 *web.config* 中。
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network host="smtp.gmail.com" port="587"
userName="[YourName@Gmail.com]"
password="[Your Password]" />
</smtp>
</mailSettings>
</system.net>
步骤 2:添加确认视图
用户注册后,我们希望将其重定向到确认页面,并告诉他检查他的电子邮件以获取确认链接,因此
添加一个名为 – **Confirmation** 的新视图
@{
ViewBag.Title = "Email Confirmation";
}
<h2>
Confirmation</h2>
<p>
Thank you for registering. Please check your email for a confirmation
request with a link that will confirm your account. Once you click the
link, your registration will be complete.</p>
在AccountController
中添加确认结果。
public ActionResult Confirmation()
{
return View();
}
步骤 3:发送邮件
在更改注册之前,我们需要创建电子邮件功能,此确认电子邮件将包含ProviderUserKey
和指向我们网站的直接链接。
SendConfirmationEmail
方法将接收用户名,并使用Membership.GetUser
,我们将能够获取该用户的全部信息,当然还有ProviderUserKey
。
我使用HttpContext
构建了确认 URL,并将用户 GUID ID 和网站组合在一起。
var verifyUrl = HttpContext.Current.Request.Url.GetLeftPart
(UriPartial.Authority) + "/Account/Verify/" + confirmationGuid;
public class EmailManager
{
private const string EmailFrom = "noreplay@gmail.com";
public static void SendConfirmationEmail(string userName)
{
var user = Membership.GetUser(userName.ToString());
var confirmationGuid = user.ProviderUserKey.ToString();
var verifyUrl = HttpContext.Current.Request.Url.GetLeftPart
(UriPartial.Authority) + "/Account/Verify/" + confirmationGuid;
using (var client = new SmtpClient())
{
using (var message = new MailMessage(EmailFrom, user.Email))
{
message.Subject = "Please Verify your Account";
message.Body = "<html><head><meta content=\"text/html;
charset=utf-8\" /></head><body><p>Dear " + user.UserName +
", </p><p>To verify your account, please click the following link:</p>"
+ "<p><a href=\"" + verifyUrl + "\" target=\"_blank\">" + verifyUrl + "
+"</a></p><div>Best regards,</div><div>Someone</div><p>Do not forward "
+"this email. The verify link is private.</p></body></html>";
message.IsBodyHtml = true;
client.EnableSsl = true;
client.Send(message);
};
};
}
}
步骤 4:更改注册
现在我们需要更改注册功能。主要的是,在创建新用户时,我们需要将用户状态更改为 **未批准**,而不是执行登录,我们需要使用我们的EmailManager
向他发送电子邮件,并向他显示确认页面。
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
//Make sure the user is not approve at this point!!!
Membership.CreateUser(model.UserName, model.Password, model.Email,
null, null, false, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
EmailManager.SendConfirmationEmail(model.UserName);
return RedirectToAction("Confirmation", "Account");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
步骤 5:添加验证
在AccountController
中,我添加了一个Verify
ActionResult。Verify
将接收用户 ID,然后我们将检查一些无效的 ID,如果用户已获批准,则注销用户并重定向到登录页面,如果用户未获批准,我们需要将IsApprove
更改为true
并调用UpdateUser
以使用新的更改更新数据库,我们还将为用户执行登录并将其重定向到主页。
public ActionResult Verify(string id)
{
if (string.IsNullOrEmpty(id) || (!Regex.IsMatch(id, @"[0-9a-f]{8}\-
([0-9a-f]{4}\-){3}[0-9a-f]{12}")))
{
ViewBag.Msg = "Not Good!!!";
return View();
}
else
{
var user = Membership.GetUser(new Guid(id));
if (!user.IsApproved)
{
user.IsApproved = true;
Membership.UpdateUser(user);
FormsAuthentication.SetAuthCookie(user.UserName, false);
return RedirectToAction("Index", "Home");
}
else
{
FormsAuthentication.SignOut();
ViewBag.Msg = "Account Already Approved";
return RedirectToAction("LogOn");
}
}
}
链接
尽情享用!