【问题标题】:Recaptcha being triggered from masterpage control从母版页控制触发 Recaptcha
【发布时间】:2011-02-20 16:00:56
【问题描述】:

我有一个包含登录控件的母版页,以便用户可以从任何页面登录/注销。但是,有几个内容页面需要 Recaptcha 控件。这会导致问题,因为当我尝试登录具有 Recaptcha 控件的页面时,系统希望我输入单词。我知道 Recaptcha 控件中缺少验证组,并且您不能在 ASP.NET 页面上拥有多个表单。有没有办法解决这个问题? 我能想到的一种“hacky”方式是在“登录”事件中,检查页面是否有 Recaptcha 控件。如果存在,则禁用它,否则继续。但是,这似乎效率很低,尤其是当页面很多并且大多数都没有 Recaptcha 控件时。

【问题讨论】:

    标签: asp.net validation forms recaptcha login-control


    【解决方案1】:

    这个问题的解决方法如下:

    1. 将 ValidationGroup 设置为登录按钮。当单击 ValidationGroup 设置为非空的按钮时,reCAPTCHA 控件将不会验证。
    2. 在需要 reCAPTCHA 验证的页面上,将按钮的 ValidationGroup 值保持为非空(否则,登录字段也将被验证),但在子例程上手动调用 RecaptchaControl.Validate()。

    Discussion threadofficial reCAPTCHA dev mailing list

    【讨论】:

    • 这是不正确的。遗憾的是,recaptcha 并未遵循此处的 asp.net 模式。 recaptcha 控件不关心验证组。每次都会评估 IsValid 属性。在该方法中,仅执行以下检查:if (Page.IsPostBack && Visible && Enabled && !this.skipRecaptcha) 因此,除了禁用或隐藏它之外,保持recaptcha 验证的唯一方法(在这种情况下)是将SkipRecaptcha 属性设置为true。
    • 我的立场是正确的。服务器端代码不适用于上述解决方法,但客户端代码可以。我已提交对存储库的修复以解决此问题。还有一个测试页面(test/ValidationGroup.aspx)来说明用法。
    【解决方案2】:

    你应该做的是:

    <form runat="server"></form>
    

    应该围绕您的整个页面内容,在您的情况下在母版页上,因为登录也在那里。

    从此时起,您可以在派生自给定母版页的任何页面上放置一个 recaptcha 控件。您在任何地方都不需要另一个 &lt;form runat="server"&gt;&lt;/form&gt; 标签。

    您必须了解,recaptcha 控件既不绑定到 html 表单提交 按钮,也不绑定到任何其他特定按钮。每次页面回发时,recaptcha 都会设置 Page.IsValid 标志。

    遗憾的是,recaptcha 不遵循 ASP.NET 标准,因为它使用了触发验证和验证组。
    所以为了防止每次recaptcha验证,你必须设置:SkipRecaptcha = true

    这会导致 recaptcha 无法验证。因此,现在涵盖了登录场景。当您想实际使用recaptcha 功能时,您只需设置SkipRecaptcha = false 并调用Page.Validate()。之后,您可以像以前一样继续使用Page.IsValid

    更简洁更好的方法是重写 recaptcha 控件以使用 BaseValidator 类。这将允许您在 recaptcha 控件上指定一个验证组,以及提交要通过 recaptcha 保护的输入的按钮。按下按钮只会导致对指定验证组的验证。
    此外,您必须为登录按钮指定验证组或设置CausesValidation = false。如果未设置验证组并且按下按钮,则会自动验证所有验证组。
    然而,这是相当先进的,所以即使是 recaptcha 的人也放弃了它,但源代码控制中仍然有一个旧版本。不能保证该版本仍然有效。让我们知道您是如何决定的。

    【讨论】:

    • BaseValidator 类派生自 Label 控件,而 reCAPTCHA 不是。
    • 我从来没有说过它会,我的第一个方法是创建一个复合控件,其中包含所有必要的控件,recaptcha 工作,并简单地添加一个额外的控件来处理验证和方便实现派生自 BaseValidatior 类(顺便说一句。实际上从 BaseValidator 派生的旧版本
    • reCAPTCHA 的呈现方式并不能证明拥有子控件是合理的(它由一个
    【解决方案3】:

    我不是 100% 确定这是相关的,但我遇到了 ReCaptcha 控件在每次回发时触发的问题 - IsValid 属性逻辑存在缺陷。我修复了这个特殊问题:http://code.google.com/p/recaptcha/issues/detail?id=56#c3

    不幸的是,ReCaptcha 项目有些停滞不前,并且有一段时间没有修复它。

    【讨论】:

      【解决方案4】:

      我与母版页中的登录控件处于完全相同的位置,并且设置 SkipRecaptcha=true; 对我不起作用。该页面仍未通过验证,并且我的 LoggingIn 事件从未在母版页中触发。

      我见过无数的解决方法,包括更新支持稀少的 Recapta,但我决定只是有选择地从等式中删除它。

      protected void Page_Load(object sender, EventArgs e)
      {
          if (IsPostback && Request["__EVENTTARGET"] == "ctl00$Login1$loginbuttonID")
              Page.Validators.Remove(recaptcha);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多