ldap_sasl_bind_s (GSSAPI) - Was soll in den Anmeldeinformationen Berval Struktur zur Verfügung gestellt werden
Frage
Bei einem Benutzername (oder ein DN) und ein Kennwort, , wie ich an die BERVAL
Struktur erhalten , dass ich angeblich zu ldap_sasl_bind_s
passieren?
Die Beispiele, die ich bisher gefunden habe
- sind von anderen LDAP C SDKs - nicht der von Microsoft
- Verwendung
ldap_sasl_bind_s
wenn einfache Authentifizierung gewünscht wird - aber ich brauche GSSAPI verwenden - Verwendung
ldap_sasl_interactive_bind_s
wenn andere SASL Authentifizierungsmechanismen erwünscht sind. Allerdings gibt es keinenldap_sasl_interactive_bind_s
in der Microsoft SDK.
Als Randbemerkung, ist das Ziel der Lage sein, SASL zu binden, über eine Vielzahl von LDAP-Servern; für jetzt. ActiveDirectory- und OpenLDAP
wird Alle Zeiger sehr geschätzt.
Lösung
ich es geschafft, einen LDAP-SASL binden über GSSAPI durchzuführen, ldap_sasl_bind_s
verwenden. Für Interessenten, hier sind einige Hinweise.
Für eine abstrakte Beschreibung der Aktionen ein Client und Server müssen während einer GSSAPI SASL Authentifizierung, "Das Kerberos V5 (" GSSAPI ") Simple Authentication and Security Layer (SASL) Mechanismus" RFC ausführen gelesen werden soll; Insbesondere Abschnitt der ‚Client-Seite von Authentication Protocol Exchange-‘ von Interesse ist, weil es einen Hinweis auf die Abfolge von Aktionen gibt müssen wir erfolgreich binden an einen LDAP-Server über Kerberos.
auszuführen Die Anmeldeinformationen ldap_sasl_bind_s
erwartet - ihre Form und ihre Bedeutung -. Hängt von dem tatsächlichen Authentifizierungsmechanismus verwendet werden, das in unserem Fall ist Kerberos
In der Microsoft SDK ist Kerberos über SSPI zur Verfügung - was in etwa die Microsoft-Implementierung von GSSAPI ist; die Methoden, die für unseren speziellen Fall relevant sind: AcquireCredentialsHandle
, InitializeSecurityContext
, DecryptMessage
, EncryptMessage
Ein LDAP-SASL binden über Kerberos hat drei Phasen.
Phase 1
Anruf AcquireCredentialsHandle
und InitializeSecurityContext
.
Wichtige Hinweise hier:
- passieren einen Zeiger auf eine Struktur zu
AcquireCredentialsHandle
SEC_WINNT_AUTH_IDENTITY
die eigentlichen Anmeldeinformationen enthält (Realm, Benutzername, Passwort) oderNULL
wenn die Anmeldeinformationen des aktuellen Threads verwendet werden - sollte der Zielname ein SPN sein auf das Konto zugeordnet, unter dem der LDAP-Server läuft
- wenn
InitializeSecurityContext
aufrufen, müssen die gegenseitige Authentifizierung angefordert werden.
Wenn alle wichtigen Argumente korrekt sind - ein gültiger Berechtigungsnachweis, gültige SPN, NULL
Eingabe-Token - der InitializeSecurityContext
Anruf SEC_I_CONTINUE_NEEDED
zurückkehren sollte und richtig die Ausgabe-Token füllen. Der Inhalt dieser Ausgabe-Token in der BERVAL
Struktur ldap_sasl_bind_s
erwartet als Client-Anmeldeinformationen gehen sollte.
Anruf ldap_sasl_bind_s
mit der Ausgabe von InitializeSecurityContext
als Client-Anmeldeinformationen Token. Wenn alle Argumente korrekt sind - leer DN, GSSAPI als Mechanismus Name - der eigentliche Anruf sollte LDAP_SUCCESS
und die aktuellste LDAP-Fehler für die LDAP-Sitzung zurückkehren sollte LDAP_SASL_BIND_IN_PROGRESS
sein.
Als Randbemerkung, die jüngsten LDAP-Fehler für eine LDAP-Sitzung können durch den Aufruf ldap_get_option
auf der Sitzung entdeckt werden, mit LDAP_OPT_ERROR_NUMBER
als Option.
Phase 2
Nach dem erfolgreichen Aufruf ldap_sasl_bind_s
, sein letztes Argument verweist auf eine BERVAL
Struktur, die die Server-Anmeldeinformationen enthält. Der Inhalt dieser BERVAL
Struktur soll jetzt als für den zweiten Anruf zu InitializeSecurityContext
Token-Eingang verwendet werden.
Dieser zweite Aufruf an InitializeSecurityContext
sollte SEC_OK
und eine leere Ausgabe-Token zurück.
Dieser leere Ausgabe-Token sollte für einen anderen Aufruf an ldap_sasl_bind_s
als die Client-Anmeldeinformationen verwendet werden. Dieser zweite Aufruf an ldap_sasl_bind_s
sollte LDAP_SUCCESS
, mit den letzten LDAP-Fehlern für die LDAP-Sitzung seines LDAP_SASL_BIND_IN_PROGRESS
zurück.
Phase 3
Nach dem zweiten erfolgreichen Aufruf ldap_sasl_bind_s
, sein letztes Argument verweist auf eine BERVAL
Struktur mit Serverdaten. Dieser Server Daten sollten als Eingabe für DecryptMessage
gegeben werden. Wie in dem zuvor erwähnten RFC angegeben, muss die entschlüsselten Daten lang 4 Byte sein.
Der Kunde sollte seine Antwort baut nach den Angaben in der gleichen RFC.
Hinweis : In meinem Fall weggelassen ich die Berechtigungs-ID in der RFC erwähnt. Zu meinem Verständnis, eine leere Berechtigungs-ID führt zu der Authentifizierungs-ID für die Autorisierung wird ebenfalls verwendet.
Die Antwort der Client gebaut sollte dann als Eingabe für EncryptMessage
weitergegeben werden. Der Ausgang des EncryptMessage
Aufruf sollte dannwie die Client-Anmeldeinformationen für den dritten und letzten Aufruf an ldap_sasl_bind_s
weitergegeben werden.
Hinweis : Die Dokumentation MSDN für EncryptMessage
unter Kerberos scheint unvollständig zu sein. Google Code Search sollte mit einem Arbeitsbeispiel unterstützen. Auch für ein Arbeitsbeispiel der Strömung oben beschrieben, Sambas Quellcode kann zu Rate gezogen werden.
Andere Tipps
Ich fand das Problem.
Nach diesem Thread ( https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1 ) gibt es einen Fehler mit ldap_sasl_bind_s Rückkehr leeren Server Anmeldeinformationen in Windows XP. Ich habe meine Anwendung unter Windows 2008 Server getestet und die Anmeldeinformationen korrekt zurückgegeben.
Artikel von Sun und MSDN . Wahrscheinlich, wenn Sie versuchen können, ein Beispielprogramm Erstellung können Sie die Antworten bekommen
Pseudo-Code
struct berval cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );