我有一个使用 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 设置设置为在其中一个目录上接受,在另一个目录上将 SSL 设置为忽略。带有“接受”的将提示浏览器输入证书,而带有“忽略”的则不会。
我尝试将 HttpsConnectionFilterOptions 设置为仅指定 ServerCertificate,希望不设置任何客户端证书相关选项将允许服务器接收客户端证书(如果发送),但不会提示浏览器提供它们。这似乎不起作用,因为我的中间件客户端证书处理程序在调用此函数时从未看到客户端证书(当 ClientCertificateMode 设置为 AllowCertificate 时会看到客户端证书)。
context.Connection.GetClientCertificateAsync();
我想简而言之,Kestrel 托管是否允许更精细的客户端证书映射/处理,还是只能使用 IIS? IIS 不是该项目的选项,我宁愿不必仅为客户端证书 api 方面创建单独的项目/进程。感谢任何帮助!