1

我正在尝试在 .net 1.1 项目中使用旧版本的 Recaptcha 验证器,可以在此处找到:http ://recaptcha.googlecode.com/svn/trunk/recaptcha-plugins/dotnet-old/src/Recaptcha /

我拥有的代码与上面链接中的示例非常相似:

<asp:TextBox ID="EmailAddress" runat="server"></asp:TextBox>
<recatpcha:RecaptchaValidator ID="RecaptchaValidator1" runat="server" Theme="Clean" PublicKey="xxxxxxxxxxxxxx" PrivateKey="xxxxxxxxxx" ControlToValidate="EmailAddress"></recatpcha:RecaptchaValidator>
<asp:Button ID="Button1" runat="server" Text="Button" CausesValidation="true" OnClick="Button1_Click" />

我想要的行为很简单:在页面加载时,用户会看到一个输入电子邮件地址的字段、一个要完成的验证码和一个提交按钮。提交时,如果在我们的数据库中没有找到使用该电子邮件地址的用户,或者验证码的回答不正确,则会显示一个新的验证码以及相应的错误消息。否则,他们将收到一封有关如何重置密码的电子邮件。

主要问题是验证码不会在页面加载时显示。然而,当我点击提交按钮时,触发 Page.Validate(),页面被重新加载并显示验证码。

基于此,我想我会尝试一种不同的方法并在页面加载事件中调用 Page.Validate() 以使验证码最初显示出来。这几乎奏效了:验证码出现在第一页加载时,但是当提交无效的电子邮件以及正确的验证码答案时,重新加载页面时验证码会消失,但当然无法发送电子邮件。

如何在最初点击页面时强制呈现验证码,或者在输入无效电子邮件地址时阻止提交验证码?

4

1 回答 1

1

嗯,它不漂亮,但我得到了它的工作。

由于使用 RecaptchaValidator 标记没有按我想要的方式工作,因此我使用了 recaptcha AJAX API ( http://recaptcha.net/apidocs/captcha/client.html ) 将小部件嵌入到页面上:

$(document).ready(function() {
    Recaptcha.create("<public key>",
        "ReCaptcha", {
        theme: "clean",
        callback: Recaptcha.focus_response_field
    });
});

然后,由于所有数据都需要使用 recaptcha 服务器(挑战、公钥等更多信息:http : //recaptcha.net/apidocs/captcha/)在 POST 中进行验证,我实例化了一个新的 RecaptchaValidator,设置其余属性,并调用该方法来验证用户响应。

protected void Submit_Click(object sender, System.EventArgs e) 
{
    RecaptchaValidator RecaptchaValidator1 = new RecaptchaValidator();
    RecaptchaValidator1.Page = this;
    RecaptchaValidator1.PrivateKey = "<private key>";
    RecaptchaValidator1.PublicKey = "<public key>";

    bool CaptchaPassed = RecaptchaValidator1.ValidateUserResponse();

    if (CaptchaPassed)
    {    
        //hide the captcha, do some stuff
    }       
}

诚然有点hacky,但它完成了工作。

注意 - 我在问题中提到了这一点,但只是重申一下:用于此的服务器端代码使用旧的 .NET 1.1 兼容的 recaptcha 插件。插件代码的链接在问题中。我的代表低得令人尴尬,不能再使用任何超链接>.<

于 2010-04-06T21:48:05.877 回答