SSL-Client-Zertifikat nur für bestimmte Routen oder Controller anfordern

Ich habe ein ASP.NET MVC Core-Projekt mit Kestrel als Server. Es dient sowohl zum Bereitstellen von Benutzerinhalten (asp.net mvc) als auch zum Hosten von Web-API-Controllern, mit denen Agenten (Software) kommunizieren. Ich habe die Unterstützung für HTTPS und Client-Zertifikate aktiviert. Das Problem ist, dass ich Client-Zertifikate für Agenten (Software) benötigen möchte, die Web-APIs aufrufen, aber keine Client-Zertifikate für normale Browser-basierte Benutzer anfordern / anfordern möchte.

Ich habe die Unterstützung für HTTPS / Client-Zertifikate auf folgende Weise aktiviert:

var host = new WebHostBuilder()
.UseKestrel(options =>
{
    HttpsConnectionFilterOptions httpsoptions = new    HttpsConnectionFilterOptions();
    httpsoptions.ServerCertificate = CertUtil.GetServerCert();
    httpsoptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
    httpsoptions.CheckCertificateRevocation = false;

    options.UseHttps(httpsoptions);
})
.UseUrls("http://0.0.0.0:5000", "https://0.0.0.0:5001")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
host.Run();

Ich habe ein separates Middleware-Handler-Setup in Startup.cs, um die benutzerdefinierte Überprüfung von Client-Zertifikaten durchzuführen. Dieser Code wird erfolgreich ausgeführt und alles funktioniert in diesem Sinne einwandfrei.

Das Problem ist, dass dies global geschieht und ich nur Client-Zertifikate auf bestimmte Controller und / oder Routen anwenden möchte. oder eigentlich würde ich an dieser stelle jede granularität nehmen.

Versuchen Sie im Wesentlichen, dasselbe Verhalten wie in IIS zu erzielen, indem Sie zwei virtuelle Verzeichnisse erstellen und anschließend die SSL-Einstellungen auf Akzeptieren und auf Ignorieren festlegen. Der mit "Akzeptieren" fordert den Browser zur Eingabe eines Zertifikats auf, der mit "Ignorieren" nicht.

Ich habe versucht, HttpsConnectionFilterOptions so einzustellen, dass nur ServerCertificate angegeben wird, in der Hoffnung, dass durch das Deaktivieren von Optionen für Clientzertifikate der Server Clientzertifikate empfangen kann, wenn diese gesendet werden, ansonsten jedoch keine Browser dazu aufgefordert werden. Dies schien nicht zu funktionieren, da mein Middleware-Client-Zertifikat-Handler beim Aufrufen dieser Funktion kein Client-Zertifikat sieht (dies ist der Fall, wenn ClientCertificateMode auf AllowCertificate gesetzt ist.

context.Connection.GetClientCertificateAsync();

Ich vermute, dass Kestrel-Hosting sogar eine detailliertere Zuordnung / Behandlung von Client-Zertifikaten ermöglicht, oder ist dies nur mit IIS möglich? IIS ist keine Option für dieses Projekt und ich würde es vorziehen, kein separates Projekt / Prozess nur für die Client-Zertifizierungsaspekte zu erstellen. Schätzen Sie jede Hilfe!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage