2013-04-23 5 views
8

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.

Antwort

7

Dies ist nicht wirklich der richtige Weg, um eine Passwort-Überprüfung auf LDAP durchzuführen, was Sie tun sollten, ist versuchen, mit der dn aus der ersten Suche und das mitgelieferte Passwort zu binden.

d. H. Sie führen eine zweite Bindung durch, um das Kennwort zu bestätigen. Wenn die Bindung fehlschlägt, ist das Passwort falsch.

So etwas wie:

if ((dn = ldap_get_dn(ld, e)) != NULL) { 
     printf("dn: %s\n", dn); 
     /* rebind */ 
     ldap_initialize(&ld2, LDAP_SERVER); 
     rc = ldap_simple_bind_s(ld2, dn, "secret"); 
     printf("%d\n", rc); 
     if (rc != 0) { 
      printf("Failed.\n"); 
     } else { 
      printf("Works.\n"); 
      ldap_unbind(ld2); 
     } 
     ldap_memfree(dn); 
    } 

Aus Sicherheitsgründen darauf hinweist, dass der Benutzername (das heißt die Suche nach dem Benutzerkonto nicht) falsch ist in der Regel eine übermäßige Offenlegung betrachtet und sollte vermieden werden.

+0

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 –

+0

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

+0

Vielen Dank für die Info! Es ist sehr geschätzt. :) –

Verwandte Themen