Google announced on their blog that they introduced a new version of reCaptcha API. As it’s fairly new, not many wrapper library has not been developed. Google has only introduced the official wrapper library in PHP for the new version. In this post, even though it’s not officially recognised by Google, I’ll introduce a .NET wrapper library for reCaptcha API.

NuGet Package
| Aliencube.ReCaptcha.NET | Aliencube.ReCaptcha.NET.MVC |
|---|---|
Its GitHub repository can be found at: https://github.com/aliencube/ReCaptcha.NET
How It Works
This library is very intuitive for use. If you are developing an ASP.NET MVC web app, all you need is download two NuGet packages stated above and use them. Let’s start from the basic usage.
Basic Usage
First of all, we need a controller to handle the reCaptcha input.
[HttpPost]
public virtual async Task<ActionResult> Index(HomeReCaptchaViewModel form)
{
var vm = form;
using (var settings = ReCaptchaV2Settings.CreateInstance())
using (var reCaptcha = new ReCaptchaV2(settings))
{
var result = await reCaptcha.SiteVerifyAsync(this.Request.Form, this.Request.ServerVariables);
vm.Success = result.Success;
vm.ErrorCodes = result.ErrorCodes;
}
return View(vm);
}
`</pre>
As you can see, `ReCaptchaV2.SiteVerifyAsync()` takes parameters of `Request.Form` and `Request.ServerVariables`. This is all you need to do in controllers. For views, do the following codes:
<pre>`@using (Html.BeginForm(MVC.Home.ActionNames.Basic, MVC.Home.Name, FormMethod.Post))
{
...
@Html.ReCaptcha(new Dictionary<string, object>() { { "class", "[class names]" }, { "data-sitekey", Model.SiteKey } })
...
}
@section Scripts
{
@Html.ReCaptchaApiJs(Model.ApiUrl)
}
`</pre>
@Html.Recaptcha()renders the reCaptcha control.@Html.ReCaptchaApiJs()renders JavaScript for the reCaptcha control.That’s all. Too easy, huh?
Advanced Usage
You might want more control over the automatic rendering. In this case, you can use the
RenderParametersclass. Properties of theRenderParametersclass can be found at: https://developers.google.com/recaptcha/docs/display#render_param.`@using (Html.BeginForm(MVC.Home.ActionNames.Advanced, MVC.Home.Name, FormMethod.Post))
{
…@Html.ReCaptcha(new Dictionary<string, object>() { { “class”, “form-group” } }, new RenderParameters() { SiteKey = Model.SiteKey, Theme = RenderThemeType.Dark })
…
}
`Rendering
api.jscan be asynchronous. For this, you can add theApiJsRenderingOptionsenum like:@section Scripts { @Html.ReCaptchaApiJs(Model.ApiUrl, ApiJsRenderingOptions.Async | ApiJsRenderingOptions.Defer) }Callback Usage
If you want to control completely by yourself, this callback approach will be suitable for you.
`@section Scripts
{
var callback = “onLoadCallback”;
var elementId = “recaptcha”;@Html.ReCaptchaApiJs(Model.ApiUrl,
ApiJsRenderingOptions.Async | ApiJsRenderingOptions.Defer, new ResourceParameters() { OnLoad = callback, Render = WidgetRenderType.Explicit, LanguageCode = WidgetLanguageCode.Korean })@Html.ReCaptchaCallbackJs(callback,
elementId, new RenderParameters() { SiteKey = Model.SiteKey, Theme = RenderThemeType.Dark })}
`For this, the
ResourceParametersclass is used inReCaptchaApiJs(). This enables to load callback function that is loaded byReCaptchaCallbackJs(). As all rendering options are defined here, the actual HTML part look like:`@using (Html.BeginForm(MVC.Home.ActionNames.Advanced, MVC.Home.Name, FormMethod.Post))
{
…<div class=”form-group” id=”@elementId”></div>
…
}
`@Html.RecaptchaCallbackJs()renders JavaScript callback function for the reCaptcha control.Settings
As you can see the above example codes, configuration settings needs to be instantiated first by calling:
`var settings = ConverterSettings.CreateInstance(); `
Alternatively, the
settingsinstance can be injected by any IoC container. The following code is, for example, using Autofac`var builder = new ContainerBuilder(); ... builder.Register(p => ReCaptchaV2Settings.CreateInstance()).As<IReCaptchaV2Settings>(); builder.RegisterType<ReCaptchaV2>().As<IReCaptchaV2>(); ... var container = builder.Build(); `
This
settingsinstance comes from eitherreCaptchaV2Settingssection orappSettingssection onApp.configorWeb.config. It firstly look for thereCaptchaV2Settingssection and, if noreCaptchaV2Settingssection is found, then look for theappSettingssection.`<configuration> <configSections> <section name="reCaptchaV2Settings" type="Aliencube.ReCaptcha.Wrapper.ReCaptchaV2Settings, Aliencube.ReCaptcha.Wrapper" requirePermission="false" /> </configSections> <reCaptchaV2Settings requestUrl="https://www.google.com/recaptcha/api/siteverify" apiUrl="https://www.google.com/recaptcha/api.js" siteKey="[YOUR_SITE_KEY]" secretKey="[YOUR_SECRET_KEY]" /> </configuration> `If you want to simply use the
appSettingssection, you can do the following instead:`<configuration>
<appSettings><add key="RequestUrl" value="https://www.google.com/recaptcha/api/siteverify" /> <add key="ApiUrl" value="https://www.google.com/recaptcha/api.js" /> <add key="SiteKey" value="[YOUR_SITE_KEY]" /> <add key="SecretKey" value="[YOUR_SECRET_KEY]" /></appSettings>
</configuration>
Conclusion
So far, we have reviewed the ReCaptcha.NET library. It’s easy to use and well integrated with ASP.NET MVC apps. With this library, your app will be more secure from spamy bots.