Schreiben eines authentifizierten SSPI-Clients

Alle RPC-Client-/Serversitzungen erfordern eine Bindung zwischen dem Client und dem Server. Zum Hinzufügen von Sicherheit zu Client-/Serveranwendungen müssen die Programme eine authentifizierte Bindung verwenden. In diesem Abschnitt wird der Prozess zum Erstellen einer authentifizierten Bindung zwischen dem Client und dem Server beschrieben.

Weitere Informationen finden Sie unter Verfahren, die mit den meisten Sicherheitspaketen und Protokollen im Platform Software Development Kit (SDK) verwendet werden.

Erstellen clientseitiger Bindungsziehpunkte

Um eine authentifizierte Sitzung mit einem Serverprogramm zu erstellen, müssen Clientanwendungen Authentifizierungsinformationen mit ihrem Bindungshandpunkt bereitstellen. Zum Einrichten eines authentifizierten Bindungshandles rufen Clients die Funktion RpcBindingSetAuthInfo oder RpcBindingSetAuthInfoEx auf. Diese beiden Funktionen sind nahezu identisch. Der einzige Unterschied zwischen ihnen besteht darin, dass der Client die Dienstqualität mit der Funktion RpcBindingSetAuthInfoEx angeben kann.

Das folgende Codefragment zeigt, wie ein Aufruf von RpcBindingSetAuthInfo aussehen könnte.

// This code fragment assumes that rpcBinding is a valid binding 
// handle between the client and the server. It also assumes that
// pAuthCredentials is a valid pointer to a data structure which
// contains the user's authentication credentials.

dwStatus = DsMakeSpn(
    "ldap",
    "ServerName.domain.com",
    NULL,
    0,
    NULL,
    &pcSpnLength,
    pszSpn);

//...

rpcStatus = RpcBindingSetAuthInfo(
    rpcBinding,                       // Valid binding handle
    pszSpn,                           // Principal name 
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,  // Authentication level
    RPC_C_AUTHN_GSS_NEGOTIATE,        // Use Negotiate SSP
    NULL,                             // Authentication credentials <entity type="ndash"/> use current thread credentials
    RPC_C_AUTHZ_NAME);                // Authorization service

Nachdem der Client die Funktionen RpcBindingSetAuthInfo oder RpcBindingSetAuthInfoEx erfolgreich aufgerufen hat, authentifiziert die RPC-Laufzeitbibliothek automatisch alle RPC-Aufrufe für die Bindung. Die Sicherheits- und Authentifizierungsebene, die der Client auswählt, gilt nur für diesen Bindungshandpunkt. Kontexthandles, die vom Bindungshandle abgeleitet werden, verwenden dieselben Sicherheitsinformationen, aber nachfolgende Änderungen an dem Bindungshandpunkt werden nicht in den Kontexthandles wiedergegeben. Weitere Informationen finden Sie unter Kontexthandles.

Die Authentifizierungsebene bleibt wirksam, bis der Client eine andere Ebene auswäht oder bis der Prozess beendet wird. Die meisten Anwendungen erfordern keine Änderung der Sicherheitsstufe. Der Client kann jedes Bindungshandle abfragen, um seine Autorisierungsinformationen abzurufen, indem er RpcBindingInqAuthClient aufruft und ihn an den Bindungshandpunkt übergeben.

Bereitstellen von Clientanmeldeinformationen für den Server

Server verwenden die Bindungsinformationen des Clients, um sicherheit zu erzwingen. Clients übergeben immer ein Bindungshandle als ersten Parameter eines Remoteprozeduraufrufs. Server können das Handle jedoch nicht verwenden, es sei denn, sie wird als erster Parameter für Remoteprozeduren in der IDL-Datei oder in der Anwendungskonfigurationsdatei (ACF) des Servers deklariert. Sie können das Bindungshandle in der IDL-Datei auflisten, aber dadurch werden alle Clients gezwungen, den Bindungshandpunkt zu deklarieren und zu bearbeiten, anstatt die automatische oder implizite Bindung zu verwenden. Weitere Informationen finden Sie in den IDL- und ACF-Dateien.

Eine weitere Methode besteht darin, die Bindungshandles aus der IDL-Datei zu verlassen und das explicit_handle-Attribut in den ACF des Servers zu platzieren. Auf diese Weise kann der Client den Typ der Bindung verwenden, der am besten für die Anwendung geeignet ist, während der Server den Bindungshandpunkt verwendet, als ob er explizit deklariert wurde.

Der Prozess des Extrahierens der Clientanmeldeinformationen aus dem Bindungshandpunkt erfolgt wie folgt:

  • RPC-Clients rufen RpcBindingSetAuthInfo auf und schließen ihre Authentifizierungsinformationen als Teil der an den Server übergebenen Bindungsinformationen ein.
  • Normalerweise ruft der Server RpcImpersonateClient auf, um sich wie der Client zu verhalten. Wenn das Bindungshandle nicht authentifiziert ist, schlägt der Aufruf mit RPC_S_NO_CONTEXT_AVAILABLE fehl. Um den Benutzernamen des Clients abzurufen, rufen Sie rpcBindingInqAuthClient beim Identitätswechsel auf, oder rufen Sie auf Windows XP- oder höher-Versionen von Windows RpcGetAuthorizationContextForClient auf, um den Autorisierungskontext abzurufen, und verwenden Sie dann Authz-Funktionen, um den Namen abzurufen.
  • Der Server ruft normalerweise CreatePrivateObjectSecurity auf, um Objekte mit ACLs zu erstellen. Nachdem dies erreicht wurde, werden spätere Sicherheitsüberprüfungen automatisch.