如果 WebClient 将证书添加到 request.ClientCertificates,是否会在 Web 应用程序的 context.Request.ClientCertificate 处找到该证书?

If WebClient adds a cert to request.ClientCertificates will the cert be found at context.Request.ClientCertificate in the web app?

我的客户端代码使用 WebClient 并将证书附加到 ClientCertificates:

 protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
            var x509 = GetMyCert();  // see note
            request.ClientCertificates.Add( x509  );
            return request;
        }

注意:我已经检查了调试器,变量 x509 在代码的此时确实包含一个有效的证书对象。

这不是将证书添加到 HttpWebRequest 以供网络应用程序使用的正确方法吗?

服务器端,证书未显示在 IHttpHandlerProcessRequest 方法中:

         context.Response.Clear();
         // set some Response caching parameters here <snip>

         HttpClientCertificate cert = context.Request.ClientCertificate;
         if (cert.IsPresent)
          {
             Hooray();
          }
          else
         {
             BooHoo();   // we are here
         }

web.config 设置为接受客户端证书:

 <system.webServer>
        <security>
            <access sslFlags="Ssl, SslNegotiateCert" />
        </security>
    </system.webServer>

Web应用配置不完整?

P.S。如果我将回调添加到覆盖的 GetWebRequest 方法:

 System.Net.ServicePointManager.ServerCertificateValidationCallback = 
        delegate (Object obj, X509Certificate X509certificate, X509Chain chain, 
        System.Net.Security.SslPolicyErrors errors)
    {
        return (errors == SslPolicyErrors.None);                
    };

errorsSslPolicyErrors.None 和回调 returns true。但据我所知,我没有在服务器上创建任何策略,除非有某种默认设置。

证书未显示在 HttpContext 中的原因是 client-side 和 server-side 之间的证书身份验证尚未建立。 简单来说,当Web应用程序托管在IIS中时,我们禁用IIS中的其他认证方式,启用IIS客户端证书映射认证。当客户端尝试访问 website/service.
时,服务器需要客户端证书


随后,下面的函数方法将有一个返回值。

public ActionResult About()
    {
        var result = System.Web.HttpContext.Current.Request.ClientCertificate;
        ViewBag.Message = result.Subject+result.ServerSubject;
        return View();
}


什么是IIS客户端证书映射认证以及如何在IIS中实现请参考文档
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/authentication/iisclientcertificatemappingauthentication/
https://docs.microsoft.com/en-us/troubleshoot/iis/configure-many-to-one-client-mappings
https://docs.microsoft.com/en-us/iis/manage/configuring-security/configuring-one-to-one-client-certificate-mappings
如果有什么我可以帮忙的,请随时告诉我。