Schreiben eines authentifizierten SSPI-Clients

Alle RPC-Client-/Serversitzungen erfordern eine Bindung zwischen dem Client und dem Server. Um Die Sicherheit für Client-/Serveranwendungen zu erhöhen, 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 Prozeduren, 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 Bindungshandle bereitstellen. Zum Einrichten eines authentifizierten Bindungshandles rufen Clients die RpcBindingSetAuthInfo - oder RpcBindingSetAuthInfoEx-Funktion auf. Diese beiden Funktionen sind nahezu identisch. Der einzige Unterschied zwischen ihnen besteht darin, dass der Client die Dienstqualität mit der RpcBindingSetAuthInfoEx-Funktion angeben kann.

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 Funktionen RpcBindingSetAuthInfo oder RpcBindingSetAuthInfoEx erfolgreich aufgerufen hat, authentifiziert die RPC-Laufzeitbibliothek automatisch alle RPC-Aufrufe für die Bindung. Die vom Client ausgewählte Sicherheits- und Authentifizierungsebene gilt nur für dieses Bindungshandle. Kontexthandles, die vom Bindungshandle abgeleitet werden, verwenden dieselben Sicherheitsinformationen, aber nachfolgende Änderungen am Bindungshandle werden nicht in den Kontexthandles widerspiegelt. Weitere Informationen finden Sie unter Kontexthandles.

Die Authentifizierungsebene bleibt so lange 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 jedes Bindungshandle abfragen, um seine Autorisierungsinformationen abzurufen, indem er RpcBindingInqAuthClient aufruft und ihm das Bindungshandle übergibt.

Bereitstellen von Clientanmeldeinformationen für den Server

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

Eine weitere Methode besteht darin, die Bindungshandles aus der IDL-Datei zu belassen und das attribut explicit_handle im ACF des Servers zu platzieren. Auf diese Weise kann der Client den Bindungstyp verwenden, der für die Anwendung am besten geeignet ist, während der Server das Bindungshandle verwendet, als wäre es explizit deklariert.

Der Prozess zum Extrahieren der Clientanmeldeinformationen aus dem Bindungshandle 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 so zu verhalten, als wäre es der Client. 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 unter Windows XP oder höheren Versionen von Windows RpcGetAuthorizationContextForClient auf, um den Autorisierungskontext abzurufen, und verwenden Sie dann die 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.