Robert Schili

Google reCaptcha on ASP NET Core MVC 6

Robert, 20.10.2016 Updated: 28.10.2016

When I added reCaptcha to this site, I used this handy Blogpost to figure out how to do it. However, I had to make a few adjustments to make it work on .NET Core. I'm going to share my version here.

First thing to do is visit the official Homepage and register for reCaptcha. The process is painless and there are good concise instructions on how to integrate it into your HTML, which just requires one script and one div.

Next for the backend integration inside the MVC Controller. I put it into its own method.

[HttpPost, ValidateAntiForgeryToken]
public async Task Login (LoginViewModel model)
    {
    bool captcha = await CheckCaptchaAsync();
    if (!captcha)
        {
        ModelState.AddModelError("", "Captcha check failed.");
        return View();
        }
 
    //do stuff...
    }

The method will use three fields which I defined as follows:

private const string CAPTCHA_SECRET = "(secret you got from google)";
private HttpClient CaptchaClient { get; } = new HttpClient();
private TimeSpan Timeout { get; } = TimeSpan.FromSeconds(10);

You might wonder why put the disposable HttpClient into a static field. That is something I just figured out recently, and it's very counter-intuitive. However, this seems to be the best way to use it. Check YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE Last step, download the Json from google and check if we got a success code. I tried to make this one robust catching all possible exceptions and using a Timeout though a CancellationToken.

private async Task CheckCaptchaAsync ()
    {
    var captchaImage = HttpContext.Request.Form["g-recaptcha-response"];
    if (string.IsNullOrEmpty(captchaImage))
        return false;
 
    var remoteIp = HttpContext.Connection?.RemoteIpAddress?.ToString() ?? "";
 
    var postData = $"&secret={CAPTCHA_SECRET}&remoteip={remoteIp}&response={captchaImage}";
    var postDataAsBytes = Encoding.UTF8.GetBytes(postData);
 
    try
        {
        using (var cts = new CancellationTokenSource())
            {
            cts.CancelAfter(Timeout);
            using (var response = await CaptchaClient.PostAsync("https://www.google.com/recaptcha/api/siteverify",
                new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"), cts.Token))
                {
 
                if (!response.IsSuccessStatusCode)
                    {
                    Logger.LogWarning($"Got error status code from Captcha {response.StatusCode.ToString()}");
                    return false;
                    }
 
                var json = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject(json).Success;
                }
            }
        }
    catch(Exception e)
        {
        Logger.LogWarning($"Exception while checking Captcha {e.Message}");
        return false;
        }
    }
 
private class CaptchaResponse
    {
    [JsonProperty("success")]
    public bool Success { get; set; }
 
    [JsonProperty("error-codes")]
    public List ErrorCodes { get; set; }
    }

Ipsum Lorem Test Post

Robert, 19.10.2016 Updated: 20.10.2016

Obligatory ipsum of lorems

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aderamus nos quidem adolescentes, sed multi amplissimi viri, quorum nemo censuit plus Fadiae dandum, quam posset ad eam lege Voconia pervenire. Ut placet, inquit, etsi enim illud erat aptius, aequum cuique concedere. Summum a vobis bonum voluptas dicitur. Ergo opifex plus sibi proponet ad formarum quam civis excellens ad factorum pulchritudinem? Sumenda potius quam expetenda. Paulum, cum regem Persem captum adduceret, eodem flumine invectio? Duo Reges: constructio interrete. Quaerimus enim finem bonorum. Laboro autem non sine causa; Si enim ad populum me vocas, eum. Cuius tanta tormenta sunt, ut in iis beata vita, si modo dolor summum malum est, esse non possit. Proclivi currit oratio. Quid enim dicis omne animal, simul atque sit ortum, applicatum esse ad se diligendum esseque in se conservando occupatum? Suo enim quisque studio maxime ducitur.

Blockquote Sunt enim quasi prima elementa naturae, quibus ubertas orationis adhiberi vix potest, nec equidem eam cogito consectari.

Nam hunc ipsum sive finem sive extremum sive ultimum definiebas id esse, quo omnia, quae recte fierent, referrentur neque id ipsum usquam referretur. Eadem nunc mea adversum te oratio est. Id et fieri posse et saepe esse factum et ad voluptates percipiendas maxime pertinere. In schola desinis. Dicimus aliquem hilare vivere; Praeclare hoc quidem. Nunc de hominis summo bono quaeritur; Quae duo sunt, unum facit. Prioris generis est docilitas, memoria; Cuius tanta tormenta sunt, ut in iis beata vita, si modo dolor summum malum est, esse non possit.

Aufidio, praetorio, erudito homine, oculis capto, saepe audiebam, cum se lucis magis quam utilitatis desiderio moveri diceret. Plane idem, inquit, et maxima quidem, qua fieri nulla maior potest. Immo alio genere; At, illa, ut vobis placet, partem quandam tuetur, reliquam deserit. Utrum enim sit voluptas in iis rebus, quas primas secundum naturam esse diximus, necne sit ad id, quod agimus, nihil interest. Ut etiam contendant et elaborent, si efficere possint, ut aut non appareat corporis vitium aut quam minimum appareat? Ut in voluptate sit, qui epuletur, in dolore, qui torqueatur. Sic igitur in homine perfectio ista in eo potissimum, quod est optimum, id est in virtute, laudatur. Nec hoc ille non vidit, sed verborum magnificentia est et gloria delectatus. Et summatim quidem haec erant de corpore animoque dicenda, quibus quasi informatum est quid hominis natura postulet. Maximas vero virtutes iacere omnis necesse est voluptate dominante. Quin etiam ferae, inquit Pacuvius, quíbus abest, ad praécavendum intéllegendi astútia, iniecto terrore mortis horrescunt.

Tum Piso: Atqui, Cicero, inquit, ista studia, si ad imitandos summos viros spectant, ingeniosorum sunt; Omnia peccata paria dicitis. Sit sane ista voluptas. Iam id ipsum absurdum, maximum malum neglegi. Nam si propter voluptatem, quae est ista laus, quae possit e macello peti? De quibus etsi a Chrysippo maxime est elaboratum, tamen a Zenone minus multo quam ab antiquis;

Pre Element.
Mihi quidem etiam lautius videtur, quod eligitur, et ad quod
dilectus adhibetur -, sed, cum ego ista omnia bona dixero,
tantum refert quam magna dicam, cum expetenda, quam valde.
Quae cum magnifice primo dici viderentur, considerata minus
probabantur.
				
  • Magni enim aestimabat pecuniam non modo non contra leges, sed etiam legibus partam.
  • Ab his oratores, ab his imperatores ac rerum publicarum principes extiterunt.
  • Te ipsum, dignissimum maioribus tuis, voluptasne induxit, ut adolescentulus eriperes P.
  • Cuius quidem, quoniam Stoicus fuit, sententia condemnata mihi videtur esse inanitas ista verborum.

At quicum ioca seria, ut dicitur, quicum arcana, quicum occulta omnia? Theophrasti igitur, inquit, tibi liber ille placet de beata vita? Somnum denique nobis, nisi requietem corporibus et is medicinam quandam laboris afferret, contra naturam putaremus datum; Qualem igitur hominem natura inchoavit? Iis igitur est difficilius satis facere, qui se Latina scripta dicunt contemnere. Cur igitur, cum de re conveniat, non malumus usitate loqui? Eam si varietatem diceres, intellegerem, ut etiam non dicente te intellego; Cur post Tarentum ad Archytam? Quae qui non vident, nihil umquam magnum ac cognitione dignum amaverunt. At cum de plurimis eadem dicit, tum certe de maximis. Ut id aliis narrare gestiant? Utilitatis causa amicitia est quaesita. Comprehensum, quod cognitum non habet?