Если WebClient добавляет сертификат в request.ClientCertificates, будет ли этот сертификат найден в context.Request.ClientCertificate в веб-приложении? - PullRequest
0 голосов
/ 06 августа 2020

Мой клиентский код использует 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, чтобы он был доступен веб-приложению?

На стороне сервера, сертификат не 'Не отображается в методе ProcessRequest из IHttpHandler:

         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>

Является ли веб-приложение конфигурация не завершена?

PS Если я добавлю обратный вызов к переопределенному методу GetWebRequest:

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

errors будет SslPolicyErrors.None, а обратный вызов вернет true. Но, насколько мне известно, я не создавал никакой политики на сервере, если только нет какого-либо значения по умолчанию.

1 Ответ

1 голос
/ 07 августа 2020

Причина, по которой сертификат не отображается в HttpContext, заключается в том, что проверка подлинности сертификата еще не была установлена ​​между стороной клиента и стороной сервера. Проще говоря, когда веб-приложение размещено в IIS, мы отключаем другие режимы аутентификации в IIS и включаем аутентификацию сопоставления сертификатов клиента IIS. серверу требуется сертификат клиента, когда клиент пытается получить доступ к веб-сайту / службе. enter image description here
enter image description here
enter image description here
Subsequently, the below function method will have a returned value.

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

enter image description here
Please refer to the documentation for what is IIS Client Certificate Mapping Authentication and how to implement it in 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 Не стесняйтесь сообщить мне, чем я могу помочь.

...