IHttpRequest::GetClientCertificate-Methode
Ruft das der Anforderung zugeordnete Clientzertifikat ab.
Syntax
HRESULT GetClientCertificate(
OUT HTTP_SSL_CLIENT_CERT_INFO** ppClientCertInfo,
OUT BOOL* pfClientCertNegotiated
);
Parameter
ppClientCertInfo
[OUT] Ein Zeiger auf eine HTTP_SSL_CLIENT_CERT_INFO-Struktur .
pfClientCertNegotiated
[OUT] true
, wenn das Clientzertifikat bereits ausgehandelt wurde; false
andernfalls . Weitere Informationen finden Sie im Abschnitt mit Hinweisen.
Rückgabewert
HRESULT
. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.
Wert | Definition |
---|---|
S_OK | Gibt an, dass kein Fehler aufgetreten ist, aber nicht garantiert, dass ein Zertifikat gefunden wurde. Weitere Informationen finden Sie im Abschnitt mit Hinweisen. |
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) | Gibt an, dass kein Clientzertifikat gefunden wurde. ERROR_NOT_FOUND ist in Winerror.h definiert. |
ERROR_INVALID_PARAMETER | Gibt an, dass der ppClientCertInfo Parameter oder pfClientCertNegotiated NULL ist. |
Bemerkungen
Ein erfolgreiches HRESULT garantiert nicht, dass ein Clientzertifikat gefunden wurde. Entwickler müssen außerdem überprüfen, ob ppClientCertInfo
nicht NULL ist.
Ein pfClientCertNegotiated
Wert von true
garantiert nicht, dass der ppClientCertInfo
nicht NULL ist.
Entwickler können die GetClientCertificate
-Methode verwenden, um das der aktuellen Anforderung zugeordnete Clientzertifikat abzurufen. Nachdem Sie die GetClientCertificate
-Methode aufgerufen haben, enthält der ppClientCertInfo
Parameter einen Zeiger auf eine HTTP_SSL_CLIENT_CERT_INFO
Struktur, die das Clientzertifikat enthält, wenn eines verfügbar ist, oder NULL, wenn kein Zertifikat verfügbar ist.
Für URLs, die kein Clientzertifikat erfordern, können Sie die NegotiateClientCertificate-Methode aufrufen, bevor Sie aufrufen GetClientCertificate
, um ein manuelles Laden des Clientzertifikats zu versuchen.
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie Sie einen Zeiger auf die HTTP_SSL_CLIENT_CERT_INFO-Struktur abrufen, indem Sie die CHttpModule::OnBeginRequest-Methode implementieren.
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;
}
Weitere Informationen zum Erstellen und Bereitstellen eines nativen DLL-Moduls finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Request-Level HTTP-Moduls mithilfe von nativem Code.
Sie können den Code optional kompilieren, indem Sie die __stdcall (/Gz)
aufrufende Konvention verwenden, anstatt die aufrufende Konvention für jede Funktion explizit zu deklarieren.
Anforderungen
type | BESCHREIBUNG |
---|---|
Client | – IIS 7.0 unter Windows Vista – IIS 7.5 unter Windows 7 – IIS 8.0 unter Windows 8 – IIS 10.0 auf Windows 10 |
Server | – IIS 7.0 unter Windows Server 2008 – IIS 7.5 unter Windows Server 2008 R2 – IIS 8.0 unter Windows Server 2012 – IIS 8.5 unter Windows Server 2012 R2 – IIS 10.0 auf Windows Server 2016 |
Produkt | – 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 |
Header | Httpserv.h |
Weitere Informationen
IHttpRequest-Schnittstelle
IHttpRequest::NegotiateClientCertificate-Methode