Partager via


IHttpRequest::GetClientCertificate, méthode

Récupère le certificat client associé à la demande.

Syntaxe

HRESULT GetClientCertificate(  
   OUT HTTP_SSL_CLIENT_CERT_INFO** ppClientCertInfo,  
   OUT BOOL* pfClientCertNegotiated  
);  

Paramètres

ppClientCertInfo
[OUT] Pointeur vers une structure HTTP_SSL_CLIENT_CERT_INFO .

pfClientCertNegotiated
[OUT] true si le certificat client a déjà été négocié ; sinon, false. Pour plus d'informations, consultez la section Notes.

Valeur renvoyée

Élément HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.

Valeur Définition
S_OK Indique qu’aucune erreur ne s’est produite, mais ne garantit pas qu’un certificat a été trouvé. Pour plus d'informations, consultez la section Notes.
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) Indique qu’aucun certificat client n’a été trouvé. ERROR_NOT_FOUND est défini dans Winerror.h.
ERROR_INVALID_PARAMETER Indique que le paramètre ou pfClientCertNegotiated a la ppClientCertInfo valeur NULL.

Remarques

Un HRESULT réussi ne garantit pas qu’un certificat client a été trouvé. Les développeurs doivent également vérifier que n’est ppClientCertInfo pas NULL.

La pfClientCertNegotiated valeur de true ne garantit pas que le n’a pas la ppClientCertInfo valeur NULL.

Les développeurs peuvent utiliser la GetClientCertificate méthode pour récupérer le certificat client associé à la demande actuelle. Après avoir appelé la GetClientCertificate méthode, le ppClientCertInfo paramètre contient un pointeur vers une HTTP_SSL_CLIENT_CERT_INFO structure, qui contiendra le certificat client le cas échéant ou NULL si aucun certificat n’est disponible.

Pour les URL qui ne nécessitent pas de certificat client, vous pouvez appeler la méthode NegotiateClientCertificate avant d’appeler GetClientCertificate pour tenter de charger manuellement le certificat client.

Exemple

L’exemple suivant montre comment obtenir un pointeur vers la structure HTTP_SSL_CLIENT_CERT_INFO en implémentant la méthode CHttpModule::OnBeginRequest .

void   checkForClientCert(IHttpContext*  pHttpContext)
{
   static long cnt;     
   // keep track of how many times we are called
   InterlockedIncrement (&cnt);  
   HRESULT hr = S_OK;
   IHttpRequest *pIHTTPR = pHttpContext->GetRequest();
   HTTP_REQUEST * pRawRequest = pIHTTPR->GetRawHttpRequest();
   HTTP_COOKED_URL hcu = pRawRequest->CookedUrl;

   // Send URL and count to the trace window
   TRC_MSGW_FULL(L"cnt = " << cnt << " URI: " << hcu.pFullUrl);

   // return immediately if not a HTTPS request
   if ( pRawRequest->pSslInfo == NULL ){
      TRC_MSG( "connection is not using SSL");
      return;
   }

   HTTP_SSL_CLIENT_CERT_INFO *pClientCertInfo=NULL;
   BOOL fccNeg;
   hr = pIHTTPR->GetClientCertificate(&pClientCertInfo,&fccNeg);

   // If you have not selected "Require Client Certificates" or called
   // NegotiateClientCertificate(), you  may get  ERROR_NOT_FOUND 

   if( hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND) ||
      pClientCertInfo == NULL ){
         TRC_HR_MSG(hr, "Cert not found" );
         return;
   }
   if(FAILED(hr)){
      LOG_ERR_HR("GetClientCertificate", hr);
      return;
   }	

   // You must verify pClientCertInfo != NULL

   if( fccNeg && pClientCertInfo != NULL){
      ULONG uSiz = pClientCertInfo->CertEncodedSize;
      TRC_MSG( "cert size: " << uSiz \
         << " Previously negotiated " << fccNeg );
      // compute the CRC check sum of the certificate
      unsigned long certCrc = genCRC(pClientCertInfo->pCertEncoded,
         pClientCertInfo->CertEncodedSize);
      TRC_MSG( "cert crc: " << certCrc );
   }
   else
      TRC_MSG( "No client certificate. fccNeg = " << fccNeg );
}

REQUEST_NOTIFICATION_STATUS
CMyHttpModule::OnBeginRequest(
                              IHttpContext*       pHttpContext,
                              IHttpEventProvider* // pProvider  
                              )
{
   checkForClientCert(pHttpContext);
   return RQ_NOTIFICATION_CONTINUE;
}

Pour plus d’informations sur la création et le déploiement d’un module DLL natif, consultez Procédure pas à pas : création d’un module HTTP Request-Level à l’aide de code natif.

Vous pouvez éventuellement compiler le code à l’aide de la __stdcall (/Gz) convention d’appel au lieu de déclarer explicitement la convention d’appel pour chaque fonction.

Spécifications

Type Description
Client - IIS 7.0 sur Windows Vista
- IIS 7.5 sur Windows 7
- IIS 8.0 sur Windows 8
- IIS 10.0 sur Windows 10
Serveur - IIS 7.0 sur Windows Server 2008
- IIS 7.5 sur Windows Server 2008 R2
- IIS 8.0 sur Windows Server 2012
- IIS 8.5 sur Windows Server 2012 R2
- IIS 10.0 sur Windows Server 2016
Produit - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
En-tête Httpserv.h

Voir aussi

IHttpRequest, interface
IHttpRequest::NegotiateClientCertificate, méthode