Ich schreibe eine Client-App (mit OpenLDAP Bibliotheken), für die die Benutzer über LDAP-Server authentifiziert wird.Wie wird die Kennwortauthentifizierung für einen LDAP-Benutzer durchgeführt?
Hier ist das Beispiel, hart codierte, Programm, das UserPassword für einen Benutzer nicht vergleichen kann.
#include <stdio.h>
#include <ldap.h>
#define LDAP_SERVER "ldap://192.168.1.95:389"
int main(int argc, char **argv){
LDAP *ld;
int rc;
char bind_dn[100];
LDAPMessage *result, *e;
char *dn;
int has_value;
sprintf(bind_dn, "cn=%s,dc=ashwin,dc=com", "manager");
printf("Connecting as %s...\n", bind_dn);
if(ldap_initialize(&ld, LDAP_SERVER))
{
perror("ldap_initialize");
return(1);
}
rc = ldap_simple_bind_s(ld, bind_dn, "ashwin");
if(rc != LDAP_SUCCESS)
{
fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc));
return(1);
}
printf("Successful authentication\n");
rc = ldap_search_ext_s(ld, "dc=ashwin,dc=com", LDAP_SCOPE_SUBTREE, "sn=ashwin kumar", NULL, 0, NULL, NULL, NULL, 0, &result);
if (rc != LDAP_SUCCESS) {
fprintf(stderr, "ldap_search_ext_s: %s\n", ldap_err2string(rc));
}
for (e = ldap_first_entry(ld, result); e != NULL; e = ldap_next_entry(ld, e)) {
if ((dn = ldap_get_dn(ld, e)) != NULL) {
printf("dn: %s\n", dn);
has_value = ldap_compare_s(ld, dn, "userPassword", "secret");
switch (has_value) {
case LDAP_COMPARE_TRUE:
printf("Works.\n");
break;
case LDAP_COMPARE_FALSE:
printf("Failed.\n");
break;
default:
ldap_perror(ld, "ldap_compare_s");
return(1);
}
ldap_memfree(dn);
}
}
ldap_msgfree(result);
ldap_unbind(ld);
return(0);
}
wenn es userpassword Ebene im LDAP-Server ist, es funktioniert. das gleiche Passwort, wenn es MD5 verschlüsselt ist, ldap_compare_s schlägt fehl. Und das liegt daran, dass ich das Klartext-Passwort zum Vergleichen übergebe.
Wie bekomme ich dieses Beispielprogramm?
Mache ich das richtig? Ist es richtig, Benutzer ldap_compare_s
über LDAP zu authentifizieren?
S.: Dies ist das erste Mal, dass ich an LDAP arbeite.
Danke für Ihre Antwort. Bindendes zweites Mal funktioniert perfekt. In einem völlig anderen Kontext habe ich eine andere Frage: Haben Sie irgendwelche Quellen darüber, mehr über das Entwerfen eines Kunden zu erfahren? Ich möchte die Funktionalität für "Verschlüsselung" und "Verweise" haben. Danke –
Verschlüsselung Unterstützung wird durch Verwendung von ldaps für Verbindungen erreicht. Zum Verfolgen von Verweisen legen Sie den LDAP_OPT_DEREF auf den gewünschten Modus fest. Entwerfen von Kunden ... Das ist leider viel zu große Frage zu beantworten. Die einzig angemessene Antwort ist "hängt davon ab". – Petesh
Vielen Dank für die Info! Es ist sehr geschätzt. :) –