Schreiben eines authentifizierten SSPI-Clients

Alle RPC-Client-/Serversitzungen erfordern eine Bindung zwischen dem Client und dem Server. Um Client-/Serveranwendungen Sicherheit zu gewährleisten, 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 Bindungshandles

Um eine authentifizierte Sitzung mit einem Serverprogramm zu erstellen, müssen Clientanwendungen Authentifizierungsinformationen mit ihrem Bindungshand handle bereitstellen. Zum Einrichten eines authentifizierten Bindungshandpunkts rufen Clients die RpcBindingSetAuthInfo- oder RpcBindingSetAuthInfoEx-Funktion auf. Diese beiden Funktionen sind nahezu identisch. Der einzige Unterschied besteht in der Angabe der Dienstqualität durch den Client mit der RpcBindingSetAuthInfoEx-Funktion.

Das folgende Codefragment zeigt, wie ein Aufruf von RpcBindingSetAuthInfo aussehen kann.

// 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 RpcBindingSetAuthInfo- oder RpcBindingSetAuthInfoEx-Funktionen erfolgreich aufruft, 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 dieses Bindungshand handle. Vom Bindungshandles abgeleitete Kontexthandles verwenden dieselben Sicherheitsinformationen, nachfolgende Änderungen am Bindungshandles werden jedoch nicht in den Kontexthandles widergespiegelt. Weitere Informationen finden Sie unter Kontexthandles.

Die Authentifizierungsebene bleibt wirksam, bis der Client eine andere Ebene auswählt oder bis der Prozess beendet wird. Die meisten Anwendungen erfordern keine Änderung der Sicherheitsstufe. Der Client kann ein beliebiges Bindungshand handle abfragen, um seine Autorisierungsinformationen zu erhalten, indem er RpcBindingInqAuthClient aufruft und ihm das Bindungshand handle über gibt.

Bereitstellen von Clientanmeldeinformationen für den Server

Server verwenden die Bindungsinformationen des Clients, um die Sicherheit zu erzwingen. Clients übergeben immer ein Bindungshand handle als ersten Parameter eines Remoteprozeduraufrufs. Server können das Handle jedoch nur verwenden, wenn es als erster Parameter für Remoteverfahren in der IDL-Datei oder in der Anwendungskonfigurationsdatei (Application Configuration File, ACF) des Servers deklariert ist. Sie können das Bindungshandl in der IDL-Datei auflisten. Dies zwingt jedoch alle Clients, das Bindungshandl zu deklarieren und zu bearbeiten, anstatt die automatische oder implizite Bindung zu verwenden. Weitere Informationen finden Sie unter Die IDL- und ACF-Dateien.

Eine andere Methode besteht im Verlassen der Bindungshandles _ aus der IDL-Datei und dem Platzieren des expliziten Handleattributs im ACF des Servers. Auf diese Weise kann der Client den Bindungstyp verwenden, der am besten für die Anwendung geeignet ist, während der Server das Bindungshand handle so verwendet, als wäre es explizit deklariert.

Das Extrahieren der Clientanmeldeinformationen aus dem Bindungshand handle erfolgt wie folgt:

  • RPC-Clients rufen RpcBindingSetAuthInfo auf und schließen ihre Authentifizierungsinformationen als Teil der Bindungsinformationen ein, die an den Server übergeben werden.
  • In der Regel ruft der Server RpcImpersonateClient auf, um sich so zu verhalten, als wäre er der Client. Wenn das Bindungshandling nicht authentifiziert ist, schlägt der Aufruf mit RPC _ S NO CONTEXT AVAILABLE _ _ _ fehl. Rufen Sie zum Abrufen des Benutzernamens des Clients rpcBindingInqAuthClient während des Identitätswechsels auf, oder rufen Sie unter Windows XP oder höher von Windows RpcGetAuthorizationContextForClient auf, um den Autorisierungskontext abzurufen, und rufen Sie dann den Namen mithilfe von Funktionen vonAuthhz ab.
  • Der Server wird normalerweise CreatePrivateObjectSecurity aufrufen, um Objekte mit ACLs zu erstellen. Nachdem dies erreicht wurde, werden spätere Sicherheitsüberprüfungen automatisch durchgeführt.