Skip to content
  • English Deutsch

benjamin-abt.com

Performance is a feature | Cloud - AI - Azure - .NET - Sustainability

  • Home
  • Blog
  • Portfolio
    • Overview
    • Workshops & Training
    • Publications
  • Contact
  • Home
  • Blog

Use hCaptcha with dotnet and ASP.NET Core

Use hCaptcha with dotnet and ASP.NET Core
April 30, 2020 3 min read BEN ABT
.NET ASP.NET Core

This article was written in 2020. Versions, tools and recommendations may have changed since then. Newer posts are collected under .NET.

Many websites protect themselves from automated access with reCaptcha, a Google company.

The top dog can be found on almost every website.

About hCaptcha

What few people know is that there are real alternatives to reCaptcha: hCaptcha.

hCaptcha is a company of Intuition Machines. Intuition Machines itself is a company that says about itself that it is an absolute specialist in deep learning. The company is located in California, USA.

They also say of themselves that they are superior to reCaptcha, especially in terms of privacy and data protection - with identical results in terms of bot checking.

Developer perspective

hCaptcha itself is still relatively young, so the documentation is not as good as reCaptcha. The documentation really only covers the essentials, which is sufficient for the basic setup.
Integration is currently only focused in web applications or applications based on HTML and JavaScript. There is no other possibility - right now.

hCaptcha currently offers two different types of bot verification:

  • By selecting images, requires interaction with the user
  • Automated, invisible and without user interaction in the background

Both variants are implemented with the help of JavaScript. The APIs are currently not quite as flexible as reCaptcha.

Otherwise the functionality is relatively similar:
The client receives an Id which is sent to the server. On the server, the captcha API must then be addressed to get the result of the check.

ASP.NET Core

Currently there is no documentation how hCaptcha can be integrated into .NET or ASP.NET core applications. The documentation here is really limited to the basics of HTML and HTTP.

hCaptcha has now received some data to create a list of community contributions:
https://github.com/hCaptcha/hcaptcha-integrations-list

I contributed the example of .NET and ASP.NET Core: https://github.com/BenjaminAbt/hcaptcha

ASP.NET Core Usage

For the use in .NET and ASP.NET Core I have created two NuGet packages:

  • NuGet which covers the basic, technology neutral functions
  • NuGet for integration into ASP.NET core applications

HCaptcha is registered via the services, whereby the necessary configuration is also registered here.

C#
1public void ConfigureServices(IServiceCollection services)
2{
3   // HCaptcha
4   services.AddHCaptcha(Configuration.GetSection("HCaptcha"));
5   ...

The configuration is limited to the most necessary: The hCaptcha SiteKey and the Secret. Both information are part of the site registration in the hCaptcha dashbaord.

C#
1"HCaptcha": {
2   "SiteKey": "", // Overwrite them with yours
3   "Secret": "" // Overwrite them with yours
4}

In case of use I have primarily decided to use a model binder.
Even if a ModelBinder is not the primary way to use it, it is a very convenient way to validate a captcha.

C#
 1public void ConfigureServices(IServiceCollection services)
 2{
 3    // HCaptcha
 4    services.AddHCaptcha(Configuration.GetSection("HCaptcha"));
 5
 6    // Mvc
 7    services.AddControllersWithViews(mvcOptions =>
 8        // add model binder
 9        mvcOptions.AddHCaptchaModelBinder());
10}

A model binder is called in ASP.NET Core when a specific data type is part of the parameter list of an action.
For this I created the HCaptchaVerifyResponse type.

Once this type is part of the action, the captcha is automatically validated in the background before the action is called. The result is then part of the instance.

C#
 1public class HomeController : Controller
 2{
 3    [HttpGet, Route("")]
 4    public IActionResult Index()
 5    {
 6        return View(new IndexViewModel());
 7    }
 8
 9    [HttpPost, Route("")]
10    public IActionResult Index(HCaptchaVerifyResponse hCaptcha)
11    {
12        return View(new IndexViewModel(hCaptcha));
13    }
14}

The alternative would be a corresponding service filter.

Related articles

Problem Details in ASP.NET Core and .NET 11

Oct 5, 2026 - 12 min read

Problem Details in ASP.NET Core and .NET 11

builder.Services.AddProblemDetails() registers infrastructure. It does not create an error contract. An ASP.NET Core request can fail during …

Resilience in .NET with Microsoft.Extensions.Resilience

Sep 21, 2026 - 11 min read

Resilience in .NET with Microsoft.Extensions.Resilience

Retries are the most visible resilience strategy and the easiest one to misuse. Repeating a failing call can recover from a short network …

What Matters in ASP.NET Core 11

Sep 14, 2026 - 10 min read

What Matters in ASP.NET Core 11

ASP.NET Core 11 has no single feature that fundamentally changes how web applications are built. That is not a criticism. Mature frameworks …


BEN ABT

BEN ABT

Ben is Chief Engineering Officer and Principal Software Engineer at Medialesson.de, with a strong focus on .NET and Microsoft Azure. In his professional role, he designs and builds highly scalable platforms for hybrid and cloud-based scenarios. He also advises companies and C-levels on migrating to the sovereign cloud.

He runs myCSharp.de, the largest and most active German-speaking C# community forum, actively contributes to both his own and external open-source projects and regularly shares his knowledge through his blog, at community events, conferences and as a writer for technical magazines.

Let's Work Together

Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.

New Platforms

Modernization

Training & Consulting

Contact Me
X Facebook LinkedIn WhatsApp
Back Next Blog Post

Open for work!

Contact Me
BEN ABT BEN ABT Software Engineer · Microsoft MVP Passionate about .NET, Azure, performance optimization and sustainable software engineering.

Medialesson GmbH Logo

Microsoft MVP Logo

Recent posts

View all
Stop Using nginx as Your Default Static File Server in Docker

Stop Using nginx as Your Default Static File Server in …

Oct 24, 2026
Containerizing .NET in 2026 Without a Dockerfile

Containerizing .NET in 2026 Without a Dockerfile

Oct 20, 2026
Problem Details in ASP.NET Core and .NET 11

Problem Details in ASP.NET Core and .NET 11

Oct 5, 2026
Resilience in .NET with Microsoft.Extensions.Resilience

Resilience in .NET with Microsoft.Extensions.Resilience

Sep 21, 2026
What Matters in ASP.NET Core 11

What Matters in ASP.NET Core 11

Sep 14, 2026

Tags

.NET (192) Csharp (96) ASP.NET Core (48) Azure (41) DevOps (17) Docker (14) Microsoft (14) EF Core (11) Microsoft MVP (11) AI (10) GitHub (10) GitHub Copilot (10) ASP.NET (9) Security (9) Synology (9) Architecture (8) Raspberry (8) Azure Functions (7) Cloudflare (7) Bicep (6)
benjamin-abt.com

About BEN

Benjamin Abt is a Software Engineer, Platform Architect and Microsoft MVP specializing in .NET, Azure, cloud architecture, performance optimization and sustainable software development.

Connect

  • Follow me on GitHub
  • Follow me on LinkedIn
  • Follow me on Mastodon
  • Microsoft MVP profile
  • Follow SchwabenCode on GitHub
  • Follow me on X

Quick Links

  • Portfolio
  • Blog
  • Workshops & Training
  • Publications
  • Get in Touch
  • Sitemap
Open for Work

© Copyright Benjamin Abt & SchwabenCode | 2011 - 2026

Content licensed under CC BY 4.0 unless otherwise noted.

  • Impressum
  • Privacy
  • Contact