Требовать SSL-сертификат клиента только для определенных маршрутов или контроллеров

У меня есть ASP.NET MVC Core проект с использованием Kestrel в качестве сервера. Он одновременно обслуживает пользовательский контент (asp.net mvc) и размещает контроллеры веб-API, с которыми взаимодействуют агенты (программное обеспечение). Я включил поддержку HTTPS и сертификата клиента. Проблема в том, что я хочу требовать клиентские сертификаты для агентов (программного обеспечения), которые вызывают веб-API, но я не хочу требовать / запрашивать клиентские сертификаты для обычных пользователей на основе браузера.

Я включил поддержку HTTPS / сертификата клиента следующим образом:

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

У меня есть отдельный обработчик промежуточного программного обеспечения в Startup.cs для обработки пользовательской проверки клиентских сертификатов. Этот код успешно выполняется, и все работает в этом смысле.

Проблема заключается в том, что это происходит глобально, и я только ищу применение клиентских сертификатов к определенным контроллерам и / или маршрутам; или на самом деле я бы взял любую гранулярность на этом этапе.

По сути, пытаясь создать такое же поведение, которое вы можете получить в IIS, создав две виртуальные директории, а затем установите для параметров SSL «Принять» для одного и игнорировать для другого. Тот, у кого есть Accept, запросит в браузере сертификат, а тот, у которого есть Ignore, - нет.

Я попытался установить HttpsConnectionFilterOptions, чтобы указывать только ServerCertificate только в надежде, что если не установить какие-либо параметры, относящиеся к сертификату клиента, сервер получит сертификаты клиента, если они будут отправлены, но в противном случае не запросит для них браузеры. Это не сработало, так как мой обработчик сертификата клиента промежуточного программного обеспечения никогда не видит сертификат клиента при вызове этой функции (это происходит, когда для ClientCertificateMode установлено значение AllowCertificate.

context.Connection.GetClientCertificateAsync();

Короче говоря, позволяет ли хостинг Kestrel более детально сопоставлять / обрабатывать клиентские сертификаты или это возможно только с использованием IIS? IIS не является вариантом для этого проекта, и я бы предпочел не создавать отдельный проект / процесс только для аспектов cert api клиента. Цени любую помощь!

Ответы на вопрос(3)

Ваш ответ на вопрос