dotnet / dotnet/aspnetcore

[API Proposal]: Provide async callback for ClientCertificateValidation in Kestrel

Open
#48,384 6 comments 0 reactions 0 assignees View on GitHub
api-suggestion area-networking blocked feature-kestrel
Dominant language
C#
Stars
38.4k
Forks
10.9k
Avg merge
2d 10h
Merged PRs (30d)
281

Description

### Background and motivation

It is currently possible to have a custom client certificate validation in Kestrel using

[HttpsConnectionAdapterOptions.ClientCertificateValidation](
https://github.com/dotnet/aspnetcore/blob/39564d529f84f7a3bbac5b28ba11060e8ac30375/src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs#L72)

However, it is currently impossible to have async validation without sync-over-async, since the signature of the callback is as below:
`public Func? ClientCertificateValidation { get; set; }`

Example:
```
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel(p =>
{
p.ConfigureHttpsDefaults(s =>
{
s.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
s.ClientCertificateValidation = (X509Certificate2 cert, X509Chain chain, SslPolicyErrors e) =>
{
Task someValidationTask = ...;
return someValidationTask.GetAwaiter().GetResult(); // sync-over-async
};
});
});

webBuilder.UseStartup();
});
```

Intention is similar to https://github.com/dotnet/runtime/issues/79441

### API Proposal

```csharp
namespace Microsoft.AspNetCore.Server.Kestrel.Https;

public Func>? ClientCertificateValidation { get; set; }
```

### API Usage

```csharp
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel(p =>
{
p.ConfigureHttpsDefaults(s =>
{
s.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
s.ClientCertificateValidation = async (X509Certificate2 cert, X509Chain chain, SslPolicyErrors e) =>
{
Task someValidationTask = ...;
return await someValidationTask;
};
});
});

webBuilder.UseStartup();
});
```

### Alternative Designs

_No response_

### Risks

Presence of two callbacks (sync and async) may confuse

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.