Fordern Sie ein SSL-Client-Zertifikat nur für bestimmte Routen oder Controller an

Fordern Sie ein SSL-Client-Zertifikat nur für bestimmte Routen oder Controller an

Ich habe versucht, dasselbe zu tun, mit genau denselben Anforderungen wie Sie.

Ich bin zu dem Schluss gekommen, dass es nicht möglich ist. Meine Problemumgehung besteht darin, 2 zu verwenden WebHostBuilder Objekte - eines für Standorte, die nicht Client-Zertifikate benötigen, und eines für diejenigen, die es tun . Dies hat den Nachteil, dass jeder IWebHost muss auf einem anderen Port lauschen, aber nach dem Szenario, das Sie beschreiben, denke ich, dass das kein großes Problem ist.

Ich mache das innerhalb desselben Prozesses, also erfüllt diese Lösung diese Anforderung.


Ich hatte das gleiche Problem mit context.Connection.GetClientCertificateAsync(); es gab immer null zurück. Dann bemerkte ich, dass ich Kestrel die ganze Zeit über IIS Express laufen ließ.

Also habe ich in Visual Studio von der Debugger-Symbolleiste von IIS Express zu meinem Projekt gewechselt. Kestrel wurde als Konsolenanwendung gestartet und ich konnte das Client-Zertifikat abrufen.

Ich denke, dass IIS Express keine Client-Zertifikate unterstützt, daher wurde das Zertifikat immer ignoriert.

Für den anderen Teil der Frage; Ich denke, Kestrel unterstützt diese Granularität nicht, die Sie bei Verwendung von HttpsConnectionFilterOptions standardmäßig sehen . Aus dem Quellcode der Kestrel-Verbindungsfilteroptionen wird die Verbindung gelöscht, wenn das Clientzertifikat null ist. Vielleicht können Sie den Quellcode für HttpsConnectionFilterOptions ändern und erstellen Sie daraus Ihren eigenen Filter. Dann können Sie den ClientCertificateValidation verwenden -Eigenschaft, um eine benutzerdefinierte Zertifikatvalidierungsmethode anzugeben, die die Verbindung zulässt, wenn kein Clientzertifikat gesendet wird.

Hoffe das hilft.