Exigir certificado de cliente SSL apenas para rotas ou controladores específicos

Eu tenho um projeto ASP.NET MVC Core usando o Kestrel como servidor. Ele serve o conteúdo do usuário (asp.net mvc) e hospeda controladores de API da web com os quais os agentes (software) se comunicam. Ativei o HTTPS e o suporte ao certificado de cliente. O problema é que desejo exigir certificados de cliente para agentes (software) que chamam APIs da Web, mas não desejo / solicite / solicite certificados de cliente para usuários regulares baseados em navegador.

Ativei o suporte ao certificado HTTPS / cliente da seguinte maneira:

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

Eu tenho uma instalação separada de manipulador de middleware no Startup.cs para lidar com a verificação personalizada de certificados de cliente. Esse código é executado com êxito e tudo funciona bem nesse sentido.

O problema é que isso ocorre globalmente e só pretendo aplicar certificados de cliente a controladores e / ou rotas específicos; ou realmente gostaria de ter alguma granularidade neste momento.

Essencialmente, tentando criar o mesmo tipo de comportamento que você pode obter no IIS, criando dois diretórios virtuais e definindo Configurações de SSL como Aceitar em um e Ignorar no outro. Aquele com Accept solicitará um certificado ao navegador e o com Ignore não.

Tentei configurar HttpsConnectionFilterOptions para especificar apenas ServerCertificate na esperança de que a não definição de opções relacionadas a certificados de cliente permitisse ao servidor receber certificados de cliente se eles forem enviados, mas, caso contrário, não solicitará navegadores para eles. Isso não pareceu funcionar, pois meu manipulador de certificados de cliente de middleware nunca vê um certificado de cliente ao chamar esta função (quando o ClientCertificateMode está definido como AllowCertificate.

context.Connection.GetClientCertificateAsync();

Eu acho que, em suma, a hospedagem Kestrel ainda permite mapeamento / manipulação de certificado de cliente mais granular ou isso só é possível usando o IIS? O IIS não é uma opção para este projeto e eu preferiria não ter que criar um projeto / processo separado apenas para os aspectos da API do certificado do cliente. Aprecio qualquer ajuda!

questionAnswers(3)

yourAnswerToTheQuestion