我有一个使用Kestrel作为服务器的ASP.NET MVC Core项目。它不仅提供用户内容(asp.net mvc),还托管了Web API控制器,用于与代理(软件)通信。我已启用了HTTPS和客户端证书支持。问题是我希望要求代理(软件)调用Web 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设置为在一个上接受,在另一个上忽略相同行为的方式。设置HttpsConnectionFilterOptions仅指定ServerCertificate,希望不设置任何客户端证书相关选项将允许服务器在接收到客户端证书时接收它们,但否则不提示浏览器。当调用此功能时,我的中间件客户端证书处理程序似乎从未看到客户端证书(当ClientCertificateMode设置为AllowCertificate时,它确实可以看到)。
context.Connection.GetClientCertificateAsync();
简短来说,Kestrel托管是否允许更精细的客户端证书映射/处理,或者只能使用IIS实现?对于这个项目,IIS不是选择,我宁愿不创建一个单独的项目/进程来处理客户端证书api方面。感谢任何帮助!