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