ユーザーが任意のページからログイン/ログアウトできるように、ログインコントロールを含むマスターページがあります。ただし、いくつかのコンテンツページにはRecaptchaコントロールが必要です。Recaptchaコントロールのあるページにログインしようとすると、システムが単語を入力することを期待するため、これにより問題が発生します。Recaptchaコントロールに検証グループがないこと、およびASP.NETページに複数のフォームを含めることができないという事実を認識しています。これを回避する方法はありますか?私が考えることができる「ハッキー」な方法は、「ログイン」イベントで、ページでRecaptchaコントロールを確認することです。存在する場合は無効にし、存在しない場合は続行します。ただし、特にページがかなり多く、ほとんどのページにRecaptchaコントロールがない場合は、これは非常に非効率に思えます。
4 に答える
この問題の回避策は次のとおりです。
- ValidationGroup を [ログイン] ボタンに設定します。ValidationGroup が空以外に設定されたボタンがクリックされた場合、reCAPTCHA コントロールは検証されません。
- reCAPTCHA 検証が必要なページでは、ボタンの ValidationGroup 値を空にしないでください (そうしないと、ログイン フィールドも検証されます) が、サブルーチンで手動で RecaptchaControl.Validate() を呼び出します。
マスターページのログインコントロールとまったく同じ位置にいて、設定SkipRecaptcha=true;が機能しませんでした。ページはまだ検証に失敗し、LoggingInイベントがマスターページで発生することはありませんでした。
まばらにサポートされているRecaptaの更新など、数え切れないほどの回避策を見てきましたが、方程式から選択的に削除することにしました。
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostback && Request["__EVENTTARGET"] == "ctl00$Login1$loginbuttonID")
Page.Validators.Remove(recaptcha);
}
あなたがすべきことは次のとおりです。
<form runat="server"></form>
ログインもそこにあるため、マスターページの場合は、ページコンテンツ全体をラップする必要があります。
この時点から、特定のマスター ページから派生した任意のページに recaptcha コントロールをドロップできます。<form runat="server"></form>どこにも別のタグは必要ありません。
recaptcha コントロールは、html フォームの送信ボタンにも他の特定のボタンにもバインドされていないことを理解する必要があります。ページがポストバックするたびに、recaptcha がPage.IsValidフラグを設定します。
悲しいことに、recaptcha は、トリガーされた検証を検証グループと組み合わせて使用することにより、ASP.NET 標準に従っていません。
したがって、recaptcha が毎回検証されるのを防ぐには、次のように設定する必要があります。SkipRecaptcha = true
これにより、recaptcha が検証されません。これで、ログイン シナリオがカバーされました。実際にrecaptcha機能を使用したい場合は、設定SkipRecaptcha = falseして呼び出すだけPage.Validate()です。その後、以前と同様に続行できますPage.IsValid。
BaseValidatorクラスを利用するように recaptcha コントロールを書き直すことは、よりクリーンで優れたアプローチです。これにより、recaptcha コントロールで検証グループを指定し、recaptcha を介して保護する入力を送信するボタンを指定できます。ボタンを押すと、指定された検証グループの検証のみが行われます。
さらに、ログイン ボタンの検証グループを指定するか、設定する必要がありますCausesValidation = false。検証グループが設定されておらず、ボタンが押されると、すべての検証グループが自動的に検証されます。
ただし、これは非常に高度であるため、recaptcha 担当者でさえあきらめましたが、ソース管理にはまだ古いバージョンが残っています。そのバージョンが引き続き機能するという保証はありません。どのように決めたか教えてください。
これが関連していると 100% 確信できるわけではありませんが、すべてのポストバックで ReCaptcha コントロールが起動するという問題がありました - IsValid プロパティ ロジックに欠陥がありました。この特定の問題を修正しました: http://code.google.com/p/recaptcha/issues/detail?id=56#c3
残念ながら、ReCaptcha プロジェクトはやや停滞しており、しばらくの間、修正がリリースされていません。