# LDAP Passwort check



## flo_hr (26. September 2007)

Guten morgen erstmal,

ich habe folgendes Problem:
Ich soll an der Arbeit über LDAP eine Verbindung zum Novell eDirectory aufbauen.
In diesem eDirectory liegen alle User mit ihren Anmeldedaten drin.
Ich muss nun von meiner Webanwendung heraus die Anmeldedaten vergleichen.

Die Verbindung zum LDAP Server funktioniert und ich kann auch verschiedene Werte auslesen. Das einzigste was ich nicht "auslesen" kann ist das Passwort. Aber ich denke ja mal das ich das sowieso nicht auslesen kann/darf. Deswegen muss es doch irgendwie die Möglichkeit geben, dass eingegeben Passwort mit dem Passwort des User's, was auf dem eDirectory liegt, zu vergleichen.

Hier mal der Code womit ich zum Beispiel den Nachnamen eines Benutzers auslesen kann:


```
InitialDirContext ctx = null;
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

//url des LDAP Servers
properties.put(Context.PROVIDER_URL, "ldap://xxx.xxx.xxx.hr-online.de");
properties.put(Context.SECURITY_AUTHENTICATION, "none");
        
try {

            NamingEnumeration results = null;
            LinkedList list = new LinkedList();
            ctx = new InitialDirContext(properties);
            
            SearchControls controls =
                    new SearchControls();
            
            controls.setSearchScope(
                    SearchControls.SUBTREE_SCOPE);

            //hier starte ich eine Suche nach dem Account "fdittmann" und bekomme 
            //das Ergebnis im NamingEnumeration Objekt zurück
            results = ctx.search("o=HR",
                    "(&(objectClass=person)(cn=fdittmann))", controls);
            

            SearchResult searchResult =
                    (SearchResult) results.next();
            Attributes attributes =
                    searchResult.getAttributes();

            //mit dem "sn" sage ich das ich den Nachnamen zurück gegeben haben will
            Attribute attr = attributes.get("sn");
            
            //hier schreibe ich dann den Nachnamen zum Testen in die Console
            String str = (String) attr.get();
            System.out.println(str);
            
            
        } catch(Exception ex) {

        }
```

ps: ich benutze die Libary "JNDI", laut Internet kann man damit über das LDAP Protokoll auf verschiedene Verzeichnisdienste zugreifen. Funktioniert ja auch, wie das obige Beispiel zeigt. Brauche jetzt nur noch eine Möglichkeit um das Passwort eines Accounts zu vergleichen.


So ich danke schonmal im vorraus für jede Antwort.
Brauche unbedingt Hilfe 

Gruss Flo


----------



## Thomas Darimont (26. September 2007)

Hallo,

schau mal hier

```
Hashtable env = new Hashtable(7);
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://xxx.xxx.xxx.hr-online.de");

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=" + userName + ", ou=Gugu, o=Gaga, c=de");
env.put(Context.SECURITY_CREDENTIALS, password);

DirContext ctx = null;
try {

    ctx = new InitialDirContext(env);
.... login erfolgreich
}catch(...Exception e){
.... login nicht erfolgreich
}finally{
   if(null != ctx){
      ctx.close();
   }
}
```

Gruß Tom


----------



## flo_hr (26. September 2007)

Hi Thomas,
vielen Dank schonmal für deine Antwort.

Ich hab das mal so ausprobiert, funktioniert aber iwie nicht. Deine Idee ist mir klar, aber ich hab die ganze Zeit gedacht dieser Teil:

```
properties.put(Context.PROVIDER_URL, "ldap://xxx.xxx.xxx.hr-online.de");
        properties.put(Context.SECURITY_AUTHENTICATION, "none");
```
ist nur dafür da, welche Rechte ich in dem eDirectory dann habe. Also das ich ohne Anmeldung nur lese Rechte habe, usw.
Das ist doch nur die Registrierung am eDirectory Server, oder !! Das dürfte doch nichts mit den ganzen Usern die im eDirectory abgelegt sind zu tun haben

Ein Arbeitskollege hat in PHP eine Webanwendung entwickelt die auch auf das eDirectory über LDAP zugreift und Username und Passwort der einzelnen User vergleicht.
Ich poste ich mal ein bißchen Code, vllt hilft der ja weiter:

```
$ds=ldap_connect("ldap://xxx.xxx.xxx.hr-online.de");
...
$r = ldap_compare($ds, "User", "Passwort im eDirectory", "eingegebenesPasswort");
if($r == TRUE) {
     $msgtext = "Willkommen";
}
else {
     $msgtext = "Passwort falsch";
}
...
```


----------



## torax13 (27. September 2007)

Die Idee von Thomas (so wird das üblicherweise auch gemacht), ist sich mit den usercredentials zu verbinden. Klappt die Anmeldung, war username/passwd richtig, sonst eben nicht.

Du hast versuch eine anonyme Verbindung zum LDAP aufzumachen, je nach LDAP wirst Du da eh nur eine begrenzte Sicht auf die Daten haben.

Hast Du es denn bereits hinbekommen?

Gruß


----------



## flo_hr (29. September 2007)

Ja mittlerweile hab "ich" es hinbekommen. Habe ein Arbeitskollegen gefunden der auch schonmal mit java über LDAP die UserAuthentifizierung gemacht hat.

Der hat mir seine Klasse gegeben, diese habe ich in mein Projekt eingebunden.
Er hat es auch mit der API "JNDI" gemacht. So wie ich es auch vorhatte. Muss mir jetzt nur nochmal genau den Quelltext anschauen, wie er den Passwort vergleich gemacht hat. Weil wie oben beschrieben konnte ich ja auch auf die Daten zugreifen. Nur der Passwortvergleich hat nicht funktioniert.

Aber trotzdem danke für alle Antworten...

Gruss Flo


----------

