65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (60投票s)

2012年1月11日

Ms-PL

4分钟阅读

viewsIcon

190941

downloadIcon

5480

如何在您的 ASP.NET MVC 网站中添加 reCAPTCHA 和电子邮件确认。

引言

ASP.NET MVC 为您提供了一种强大的、基于模式的方式来构建动态网站,它能够清晰地分离关注点,并让您完全控制标记,从而实现轻松愉快的敏捷开发。

ASP.NET MVC 包含许多功能,可实现快速、易于进行测试驱动开发的开发,用于创建使用最新 Web 标准的复杂应用程序。

您也可以从Microsoft Gallery中选择基于 ASP.NET MVC 的现有平台,例如:

  • 博客
  • CMS
  • 电子商务
  • 论坛
  • 图库
  • Wiki
  • 还有更多

但是,您可能需要添加到任何 Web 应用程序中的一个方面是**机器人防护和电子邮件完整性**。

那么,如何防止“机器人”(通常用于生成垃圾邮件的自动化程序)滥用,以及如何确保用户在您的 Web 应用程序注册时提供了真实的电子邮件地址呢?

答案是:reCAPTCHA 和电子邮件确认

reCAPTCHA

ASPNETMVCSecurity/1.png

CAPTCHA 是一种程序,可以判断其用户是人还是计算机。您可能已经见过它们——在 Web 注册表单底部带有扭曲文本的彩色图像。许多网站都使用 CAPTCHA 来防止“机器人”(通常用于生成垃圾邮件的自动化程序)滥用。计算机程序无法像人类一样读取扭曲的文本,因此机器人无法浏览受 CAPTCHA 保护的网站。

步骤 1:下载并获取 reCAPTCHA 密钥

首先访问 reCAPTCHA 网站并注册以获取唯一密钥,然后下载 reCAPTCHA .NET 库

安全地保存您的公共密钥和私钥。

ASPNETMVCSecurity/2.png

步骤 2:创建 ASP.NET MVC 3 Web 应用程序

现在,让我们在 Visual Studio 2010 中启动一个新的 ASP.NET MVC 3 Web 应用程序项目。

ASPNETMVCSecurity/3.png

选择从“Internet 应用程序”模板创建。

ASPNETMVCSecurity/4.png

步骤 3:Recaptcha

将 Recaptcha DLL 添加为项目的引用。

ASPNETMVCSecurity/5.png

使用新的密钥修改网站的 *Web.config* 文件,在appSettings 部分下添加我们之前收到的密钥。

  • ReCaptchaPrivateKey
  • ReCaptchaPublicKey

ASPNETMVCSecurity/6.png

步骤 4:更改注册

打开 *Controllers* 文件夹,打开 AccountController 文件,找到Register 方法,添加新的属性

[RecaptchaControlMvc.CaptchaValidatorAttribute] 

ASPNETMVCSecurity/7.png

并将 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()) 

ASPNETMVCSecurity/8.png

运行您的网站并进入注册页面,现在您必须在完成注册之前输入验证码。

ASPNETMVCSecurity/9.png

电子邮件确认

为了确保用户提供了真实的电子邮件地址,您需要在您的网站中使用电子邮件确认机制。

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");
        }
    }
} 

链接

尽情享用!

© . All rights reserved.