Requerir certificado de cliente SSL solo para rutas o controladores específicos

Tengo un proyecto ASP.NET MVC Core que usa Kestrel como servidor. Sirve contenido de usuario (asp.net mvc) y aloja controladores de API web con los que se comunican los agentes (software). He habilitado HTTPS y soporte de certificado de cliente. El problema es que quiero solicitar certificados de cliente para los agentes (software) que llaman a las API web, pero no quiero solicitar / solicitar certificados de cliente para usuarios habituales basados en el navegador.

He habilitado HTTPS / certificado de cliente de la siguiente manera:

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();

Tengo una configuración de controlador de middleware separada en Startup.cs para manejar la verificación personalizada de los certificados de cliente. Este código se ejecuta con éxito y todo funciona bien en ese sentido.

El problema es que esto ocurre globalmente y solo estoy buscando aplicar certificados de cliente a controladores y / o rutas específicos; o realmente tomaría cualquier granularidad en este punto.

Esencialmente tratando de crear el mismo tipo de comportamiento que puede obtener en IIS creando dos directorios virtuales y luego configurando la Configuración SSL para Aceptar en uno e Ignorar en el otro. El que tiene Aceptar le pedirá al navegador un certificado y el que ignora no.

Intenté configurar HttpsConnectionFilterOptions para especificar solo ServerCertificate con la esperanza de que no establecer ninguna opción relacionada con el certificado del cliente permitiría al servidor recibir certificados del cliente si se envían, pero de lo contrario no solicitaría navegadores para ellos. Esto no parecía funcionar ya que mi controlador de certificado de cliente de middleware nunca ve un certificado de cliente cuando llama a esta función (lo hace cuando ClientCertificateMode está configurado en AllowCertificate.

context.Connection.GetClientCertificateAsync();

Supongo que, en resumen, ¿el alojamiento Kestrel incluso permite un mapeo / manejo de certificados de cliente más granular o solo es posible usando IIS? IIS no es una opción para este proyecto y preferiría no tener que crear un proyecto / proceso separado solo para los aspectos de la API del cliente. Agradezco cualquier ayuda!

Respuestas a la pregunta(3)

Su respuesta a la pregunta