我有一个使用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中设置了一个单独的中间件处理程序来处理客户端证书的自定义验证。这段代码确实成功执行,从某种意义上说一切正常。
问题是全局发生这种情况,我只想将客户端证书应用于特定的控制器和/或路由;或者我真的会采取任何粒度。
基本上尝试通过创建两个虚拟目录,然后将SSL设置设置为接受一个而忽略另一个,创建可以在IIS中获得的相同类型的行为。带有Accept的那个将提示浏览器提供证书,而忽略的那个则不会。
我尝试将HttpsConnectionFilterOptions设置为仅指定ServerCertificate,希望不设置任何客户端证书相关选项将允许服务器在发送时接收客户端证书,否则不会提示浏览器。这似乎不起作用,因为我的中间件客户端证书处理程序在调用此函数时从未看到客户端证书(当ClientCertificateMode设置为AllowCertificate时它会执行。
context.Connection.GetClientCertificateAsync();
我想简而言之,Kestrel托管甚至允许更细粒度的客户端证书映射/处理,还是只能使用IIS? IIS不是此项目的选项,我宁愿不必为客户端cert api方面创建单独的项目/进程。感谢任何帮助!
答案 0 :(得分:5)
我一直在努力做同样的事情,与你的要求完全一样。
我得出的结论是,这是不可能的。我的解决方法是使用 2 WebHostBuilder
个对象 - 一个用于不 需要客户端证书的位置,另一个用于做< / em>的。这确实有一个缺点,即每个IWebHost
必须在不同的端口上监听,但从你描述的场景我认为这不是一个大问题。
我在同一个过程中执行此操作,因此此解决方案符合该要求。
答案 1 :(得分:3)
我遇到与context.Connection.GetClientCertificateAsync();
相同的问题,它始终返回null。然后我注意到我一直在通过IIS Express运行Kestrel。
因此,在Debuger工具栏的Visual Studio中,我从IIS Express更改为我的项目。 Kestrel作为控制台应用程序启动,我能够获得客户端证书。
我认为IIS Express不支持客户端证书,因此始终忽略证书。
问题的其他部分;我认为Kestrel dos在使用HttpsConnectionFilterOptions
时不支持这种开箱即用的粒度。如果客户端证书为空,则从Kestrel Connection Filter Options source code连接将被删除。也许您可以修改HttpsConnectionFilterOptions
的源代码并从中创建自己的过滤器。然后,您可以使用ClientCertificateValidation
属性指定自定义证书验证方法,该方法将在未发送客户端证书时允许连接。
希望这有帮助。
答案 2 :(得分:1)
我已经找到了如何仅在某些路由上使用客户端证书,但在Azure Web App中运行时,客户端证书未传递给代码。在IIS Express下运行时也是同样的问题。
在此示例中,One控制器不需要证书,另外两个需要不同的证书。 https://github.com/xavierjohn/ClientCertificateMiddleware
如果在IIS Express下不运行,证书确实会通过。
答案 3 :(得分:-1)
无需使用隔离的(新的)IWebHost来控制对专用MVC控制器的访问。 为此,只需使用MVC Filter。