Schreiben eines authentifizierten SSPI-Servers
Bevor eine authentifizierte Kommunikation zwischen client- und Serverprogrammen stattfinden kann, muss der Server seine Authentifizierungsinformationen registrieren. Insbesondere muss der Server seinen Prinzipalnamen registrieren und den von ihm verwendeten Authentifizierungsdienst angeben. Weitere Informationen zu Prinzipalnamen finden Sie unter Prinzipalnamen. Ausführliche Informationen zu Authentifizierungsdiensten finden Sie unter Authentifizierungsdienste.
Um die Authentifizierungsinformationen zu registrieren, rufen Server die RpcServerRegisterAuthInfo-Funktion auf. Übergeben Sie einen Zeiger auf den Prinzipalnamen als Wert des ersten Parameters. Legen Sie den zweiten Parameter auf eine Konstante fest, die den von der Anwendung verwendeten Authentifizierungsdienst angibt. Eine Beschreibung der Authentifizierungsdienste finden Sie unter Authentication-Service Constants.
Der Server kann auch die Adresse einer Schlüsselerfassungsfunktion als Wert des dritten Parameters übergeben. Weitere Informationen finden Sie unter Schlüsselerfassungsfunktionen. Um die Standardschlüsselerfassungsfunktion für den ausgewählten Authentifizierungsdienst zu verwenden, legen Sie den dritten Parameter auf NULL fest. Der letzte Parameter für die RpcServerRegisterAuthInfo-Funktion ist ein Zeigerdaten, der an die Schlüsselerfassungsfunktion übergeben werden soll, wenn Sie eine Schlüsselerfassungsfunktion bereitstellen. Im folgenden Codefragment wird ein Aufruf von RpcServerRegisterAuthInfo angezeigt.
dwStatus = DsMakeSpn(
"ldap",
"ServerName.domain.com",
NULL,
0,
NULL,
&pcSpnLength,
pszSpn);
rpcStatus = RpcServerRegisterAuthInfo (
psz, // Server principal name
RPC_C_AUTHN_GSS_NEGOTIATE, // Authentication service
NULL, // Use default key function
NULL); // No arg for key function
Darüber hinaus kann der Server die RPC-Laufzeitbibliothek mit einer Autorisierungsfunktion bereitstellen. Um eine Autorisierungsfunktion festzulegen, rufen Sie die RpcMgmtSetAuthorizationFn-Funktion auf.
Der Serverteil einer verteilten Anwendung kann die Funktion RpcBindingInqAuthClient oder RpcBindingInqAuthClientEx aufrufen, um ein Bindungshandle für Authentifizierungsinformationen abzufragen.
Wenn Sich Ihr Server bei einem Sicherheitssupportanbieter registriert, werden Clientaufrufe mit ungültigen Anmeldeinformationen nicht gesendet. Anrufe ohne Anmeldeinformationen werden jedoch gesendet. Es gibt drei Möglichkeiten, dies zu verhindern:
- Registrieren Sie die Schnittstelle mithilfe von RpcServerRegisterIfEx mit einer Sicherheitsrückruffunktion. Dies führt dazu, dass die RPC-Laufzeitbibliothek nicht authentifizierte Aufrufe dieser Schnittstelle automatisch ablehnt. Die Registrierung einer Rückruffunktion ist mit anderen Methoden zum Überprüfen von Zugriffsanmeldeinformationen kompatibel. Die Rückruffunktion kann selbst die Funktionen RpcImpersonateClient, RpcGetAuthorizationContextForClient oder RpcBindingInqAuthClientEx oder andere aufrufen. Diese Funktionen können jedoch die an die Funktion übergebenen Argumente nicht verwenden, da sie zu diesem Zeitpunkt nicht miteinander verworren sind.
Wichtig
Die Registrierung der Schnittstelle mithilfe von RpcServerRegisterIfEx mit einer Sicherheitsrückruffunktion ist die am häufigsten empfohlene Methode zum Überprüfen von Clientanmeldeinformationen.
- Rufen Sie RpcBindingInqAuthClient auf, um die Vom Client verwendete Sicherheitsstufe zu ermitteln. Ihr Stub kann dann einen Fehler zurückgeben, wenn der Client nicht authentifiziert ist.