ASP.NET MVC验证码实现

6
我试图在我的应用程序中的部分视图上实现验证码。我已经将验证码作为控件通过web.config进行引用。我使用了这个论坛帖子中的GenericHandler和Class文件:http://forums.asp.net/t/1871186.aspx/1
如果我使用简单的input标签,如何引用用户的输入?我应该使用HtmlHelper吗?
           <div class="captcha">
                <rhcap:Captcha ID="Captcha1" runat="server"></rhcap:Captcha>
                <input type="text" id="UserCaptchaText"><input/>
                <%= Html.TextAreaFor(m => m.UserCaptcha) %>
            </div>

            <%if(Captcha1.Text != /* How can get the users input here?*/ ) {
                  //display error

            }else{
                   //proceed
            }%>

1
NuGet Google reCAPTCHA V2适用于MVC 4和5 - Sender
4个回答

15

我的上级不喜欢ReCaptcha。我如何说服他它是最好的选择?我只用了不到5分钟来实现ReCaptcha... - user1977591
是的。他们认为微软内置的验证码将同样容易。您有多久的时间来使用内置的验证码?我找不到太多关于它的文档,至少对于MVC 4来说是这样。 - user1977591
@user1977591 - 在MVC中没有内置的验证码。我不知道在任何Microsoft asp.net库中是否有内置的验证码,您是指什么? - Erik Funkenbusch
@user1977591 - 也许他们在谈论WebHelpers库,但是正如NuGet页面http://nuget.org/packages/microsoft-web-helpers/上所说,WebHelpers与MVC不兼容。 - Erik Funkenbusch
哇,谢谢你提供这个信息。他们确信MVC 4内置了验证码功能。我找到了这个链接http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx,如果你滚动到验证部分,它提到了验证码。 - user1977591
显示剩余2条评论

10

NuGet MVC 4和5的 Google reCAPTCHA V2

在web.config文件的appSettings部分中,添加如下键:

<appSettings>
   <add name="reCaptchaPublicKey" value="Your site key" />
   <add name="reCaptchaPrivateKey" value="Your secret key" />
</appSettings>

在你的视图中添加 reCAPTCHA。

@using reCAPTCHA.MVC
@using (Html.BeginForm())
{
    @Html.Recaptcha()
    @Html.ValidationMessage("ReCaptcha")
    <input type="submit" value="Register" />
}

验证用户的响应。

[HttpPost]
[CaptchaValidator]
public ActionResult Index(RegisterModel registerModel, bool captchaValid)
{
    if (ModelState.IsValid)
    {
    }
    return View(registerModel);
}

编辑:

你还应该将此代码添加到你的head标签中,否则你可能会看到不正确的验证码。

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

2

首先,看起来您正在混合使用标准ASP.NET和ASP.NET MVC。如果您想要使用MVC,标准的方法是使用Html.TextBoxFor()类型的东西,然后在控制器操作方法中处理该值,而不是在页面中编写内联内容。因此,您可以像这样:

Page.aspx
<rhcap:Captcha ID="Captcha1" runat="server"></rhcap:Captcha>
<%= Html.TextBoxFor(m => m.UserCaptcha) %>

接着在:

SomeController.cs

[HttpGet]
public ActionResult Page()
{
    // generate captcha code here
    ControllerContext.HttpContext.Session["Captcha"] = captchaValue;
    return View(new PageViewModel());
}

[HttpPost]
public ActionResult Page(PageViewModel model)
{
    if (model.UserCaptcha == ControllerContext.HttpContext.Session["Captcha"])
    {
        // do valid captcha stuff
    }
}

将此提升至更高层次的是在 FilterAttribute 中实现它。但这应该适用于大多数情况。

每个会话只有一个验证码值?如果您在不同的网站上有多个验证码怎么办? - Tim Schmelter

1
我建议您使用Google reCAPTCHA,它是最好且易于实现的,而且还带有Google的信任。
非常有效且易于实现。
请阅读我在在ASP.NET MVC中实施Google reCAPTCHA上撰写的文章。
谢谢

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接