[API Proposal]: Provide async callback for ClientCertificateValidation in 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
Assessment
This issue has not been assessed yet.