The code below is an example approach for reCAPTCHA implemented as ASP.NET WebForms control:
/// <summary>
/// NoCaptcha ReCaptcha for WebForms
/// </summary>
/// <remarks>
/// https://developers.google.com/recaptcha/docs/verify
/// </remarks>
public class NoRecaptchaControl : Control
{
public class APIResponse
{
public bool success { get; set; }
public string[] error_codes { get; set; }
}
public string PrivateKey { get; set; }
public string PublicKey { get; set; }
public string Theme { get; set; }
private const string RESPONSE_FIELD_KEY = "g-recaptcha-response";
public bool IsValid
{
get
{
try
{
var query = HttpUtility.ParseQueryString( string.Empty );
query["secret"] = this.PrivateKey;
query["response"] = this.Context.Request.Form[RESPONSE_FIELD_KEY];
HttpClient client = new HttpClient();
client.BaseAddress = new Uri( "https://www.google.com/" );
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
HttpResponseMessage httpresponse =
client.GetAsync( string.Format( "recaptcha/api/siteverify?{0}", query.ToString() ) ).Result;
var response = httpresponse.Content.ReadAsAsync<APIResponse>().Result;
return response.success;
}
catch ( Exception ex )
{
return false;
}
}
}
protected override void Render( HtmlTextWriter writer )
{
writer.WriteBeginTag( "script" );
writer.WriteAttribute( "src", "https://www.google.com/recaptcha/api.js" );
writer.WriteAttribute( "async", "true" );
writer.WriteAttribute( "defer", "true" );
writer.Write( HtmlTextWriter.TagRightChar );
writer.WriteEndTag( "script" );
writer.WriteBeginTag( "div" );
writer.WriteAttribute( "class", "g-recaptcha" );
writer.WriteAttribute( "data-sitekey", this.PublicKey );
writer.Write( HtmlTextWriter.TagRightChar );
writer.WriteEndTag( "div" );
base.Render( writer );
}
}
This uses the HttpClient, make sure to reference the Microsoft.AspNet.WebApi.Client package.
The usage is simple, just put the control on your form:
<%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="My.Recaptcha.Assembly.Name" %>
...
<recaptcha:NoRecaptchaControl
ID="recaptcha" runat="server"
ClientIDMode="Static" Theme="clean" />
set both private and public keys:
protected override void OnPreInit( EventArgs e )
{
base.OnPreInit( e );
recaptcha.PrivateKey = "...";
recaptcha.PublicKey = "...";
}
and you are done:
protected void button_Click( object sender, EventArgs e )
{
if ( recaptcha.IsValid )
{
...
}
else
{
...
}
}
No comments:
Post a Comment