Schreiben eines authentifizierten SSPI-Servers
Bevor die authentifizierte Kommunikation zwischen client- und serverseitigen Programmen erfolgen kann, muss der Server seine Authentifizierungsinformationen registrieren. Insbesondere muss der Server seinen Prinzipalnamen registrieren und den verwendeten Authentifizierungsdienst angeben. Weitere Informationen zu Prinzipalnamen finden Sie unter Prinzipalnamen. Weitere Informationen zu Authentifizierungsdiensten finden Sie unter Authentifizierungsdienste.
Um seine 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-Konstanten.
Der Server kann auch die Adresse einer Schlüsselerwerbsfunktion als Wert des dritten Parameters übergeben. Weitere Informationen finden Sie unter Schlüsselerfassungsfunktionen. Um die Standardfunktion für den Schlüsselerwerb für den ausgewählten Authentifizierungsdienst zu verwenden, legen Sie den dritten Parameter auf NULL fest. Der letzte Parameter der RpcServerRegisterAuthInfo-Funktion sind Zeigerdaten, die an die Schlüsselerfassungsfunktion übergeben werden sollen, wenn Sie eine Schlüsselerfassungsfunktion bereitstellen. Ein Aufruf von RpcServerRegisterAuthInfo wird im folgenden Codefragment 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 nach Authentifizierungsinformationen abzufragen.
Wenn sich Ihr Server bei einem Sicherheitssupportanbieter registriert, werden Clientaufrufe mit ungültigen Anmeldeinformationen nicht gesendet. Aufrufe ohne Anmeldeinformationen werden jedoch gesendet. Es gibt drei Möglichkeiten, dies zu verhindern:
- Registrieren Sie die Schnittstelle mit rpcServerRegisterIfExmit einer Sicherheitsrückruffunktion. Dadurch lehnt die RPC-Laufzeitbibliothek nicht authentifizierte Aufrufe dieser Schnittstelle automatisch ab. Das Registrieren einer Rückruffunktion ist mit anderen Methoden zum Überprüfen von Zugriffsanmeldeinformationen kompatibel. Die Rückruffunktion kann die Funktionen RpcImpersonateClient, RpcGetAuthorizationContextForClientoder RpcBindingInqAuthClientEx oder andere aufrufen. Diese Funktionen können jedoch nicht die argumente verwenden, die an die Funktion übergeben werden, da sie zu diesem Zeitpunkt nicht unmarsmarkiert sind.
Wichtig
Das Registrieren der Schnittstelle mit rpcServerRegisterIfEx bei einer Sicherheitsrückruffunktion ist die am häufigsten empfohlene Methode zum Überprüfen von Clientanmeldeinformationen.
- Rufen Sie RpcBindingInqAuthClient auf, um die Sicherheitsstufe zu bestimmen, die der Client verwendet. Ihr Stub kann dann einen Fehler zurückgeben, wenn der Client nicht authentifiziert ist.