mean1312
Goto Top

LDAP - Bind funktioniert nicht

Will auf AD-Server zugreifen; Admin-Rechte vorhanden; LDAP_Connect() erfolgreich; Bind: "Invalid Credentials"

Hallo

ich versuche gerade per PHP-Script auf die AD über das Intranet (von einem Testserver: ISS, PHP5) zuzugreifen.

Wenn ich lediglich ldap_connect() mache meldet mir ldap_errors "success". Will ich dann an den Server binden kommt die Meldung "Invalid Credentials".

Ich habe Admin-Rechte auf die AD und komme über RDC problemlos auf den Server.

Die Struktur der Test-AD sieht folgendermaßen aus:

Domain: domain.test
1. OU in domain.test: DE
1. OU in DE: Standort
1. OU in Standort: Users

Hat jemand eine Idee, woran das liegt (denke mal an dem Domain-OU-Pfad); hab auch schon Beispielklassen für die Verbindung verwendet, aber ging alles irgendwie nicht.

// LDAP variables

$ldap['user']              = 'ldapUser';  

$ldap['pass']              = 'ldapPass';  

$ldap['host']              = '00.00.00.00';  

$ldap['port']              = 389;  

$ldap['dn']          		= 'cn='.$ldap['user'].',ou=Users,ou=Standort,dc=domain,dc=test';  

$ldap['base']              = '';  

 

// connecting to ldap

$ldap['conn'] = ldap_connect($ldap['host'], $ldap['port'])  

       or die( "Could not connect to {$ldap['host']}" );  

 

// binding to ldap

$ldap['bind'] = ldap_bind( $ldap['conn'], $ldap['dn'], $ldap['pass'] );  

 


echo ldap_error($ldap['conn']);  
Vielen Dank und Grüße,

Dirk
Änderungen:
Hab den Code in einen Codeblock gepackt
masterG(Moderator) 19.06.2007

Content-Key: 61739

Url: https://administrator.de/contentid/61739

Printed on: April 19, 2024 at 02:04 o'clock

Member: Mean1312
Mean1312 Jun 19, 2007 at 09:30:28 (UTC)
Goto Top
Hallo nochmal,

also: War mein Fehler, da ich ausversehen, statt benutzer@domain.test nur benutzer als Benutzername verwendet habe. In VBScript ging das, deshalb war ich der Meinung, daß es auch in PHP gehen würde...

Also das binden funktioniert jetzt schon mal. Was ich jetzt aber noch lösen muß (dachte, daß sich das mehr oder weniger ergeben würde, wenn der Login klappt):

Das ganze soll als Autentisierung für bestimmte Bereiche des Intranet benutzt werden. Nun sollen aber z.B. nur die Leute, die in der Netzwerker- und die, die in der Softwaregruppe sind (bei der Abfrage müßte ich irgendwie vermerken, in welcher Gruppe der Login-User ist). Wie kann ich das denn aus den Gruppen auslesen/test? Geht das irgendwie?

Danke und Grüße,

Dirk
Member: sihelpdesk
sihelpdesk Jun 19, 2007 at 09:37:17 (UTC)
Goto Top
HI..

Also erstens solltest du schauen, dass deine Verbindung zur LDAP DB überhaupt funktioniert.

Am besten mit:

// LDAP Konfiguration
$ldapadmin         = "user@domain-name"; //Admin-Abfragebenutzer  
$ldapadminpw       = ""; //Admin-Passwort  
$ds                = "testserver1"; //LDAP-Server  
$dn                = "ou=Ordner,dc=google,dc=ch"; //LDAP-Root OU   
$ldapport          = 389;  //LDAP-Port

// LDAP Verbindung aufbauen
$ldapconn = ldap_connect($ds, $ldapport)or die("Could not connect to LDAP server.");  

// Verbindungs-Test
  if ($ldapconn)
  {
  	  // LDAP Bind herstellen
	  ldap_set_option($ldapconn, LDAPPT_PRTCL_VERSIN,3);
	  ldap_set_option($ldapconn, LDAPPT_REFERRALS,0);
	  $ldapbind = ldap_bind($ldapconn, $ldapadmin, $ldapadminpw);

	  // Authorisierungs-Test
	  if ($ldapbind)
	  {
                 echo "cool";  

          } else {
         
                 echo "nicht cool";  

          }

Nun wenn das funktioniert, kannst du weiter mit Filter und der Funktion ldap_search(), ldap_sort() und ldap_get_entries() arbeiten.

Liebe Grüsse

Goran
[EDIT 19.06.2007]
Hab den Code in einen Codeblock gepackt!
masterG(Moderator)
Member: sihelpdesk
sihelpdesk Jun 19, 2007 at 09:54:24 (UTC)
Goto Top
Hallo nochmal,

also: War mein Fehler, da ich ausversehen,
statt benutzer@domain.test nur benutzer als
Benutzername verwendet habe. In VBScript ging
das, deshalb war ich der Meinung, daß
es auch in PHP gehen würde...

Also das binden funktioniert jetzt schon
mal. Was ich jetzt aber noch lösen
muß (dachte, daß sich das mehr
oder weniger ergeben würde, wenn der
Login klappt):

Das ganze soll als Autentisierung für
bestimmte Bereiche des Intranet benutzt
werden. Nun sollen aber z.B. nur die Leute,
die in der Netzwerker- und die, die in der
Softwaregruppe sind (bei der Abfrage
müßte ich irgendwie vermerken, in
welcher Gruppe der Login-User ist). Wie kann
ich das denn aus den Gruppen auslesen/test?
Geht das irgendwie?

Danke und Grüße,

Dirk

Damit du das hinkriegst,
musst du im Filter einen User definieren, dessen Gruppenangehörigkeiten auslesen, und diese Auf die Gewünschte Gruppe überprüfen.
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(samaccountname=".$userid."))";
$fields = array("memberof");
$sr = ldap_search($ldapconn, $dn, $filter, $fields);
$data = ldap_get_entries($ldapconn, $sr);

Nun solltest du in $data["memberof"] die Liste aller Gruppen dessen der Benutzer angehört haben.

Lg.
Member: Mean1312
Mean1312 Jun 19, 2007 at 10:25:10 (UTC)
Goto Top
Hi sihelpdesk und Goran,

vielen Dank für eure Antworten!

@sihelpdesk: Super, das ist ja (fast) schon die fertige Lösung ;)

@goran: Danke für den Tipp! So eine Prüfung habe ich bereits drin - hab das aber nur weggelassen, weil ich alles (für die Anfrage) unnötige aus dem Script raushalten wollte...

Vielen Dank nochmals und Grüße,

Dirk
Member: sihelpdesk
sihelpdesk Jun 19, 2007 at 10:28:18 (UTC)
Goto Top
ahja.. dabei noch sehr wichtig bei ADS!

Vor dem ldap_connect()

solltest du noch folgende zwei optionen setzten

ldap_set_option($ldapconn, LDAPPT_PRTCL_VERSIN,3);
ldap_set_option($ldapconn, LDAPPT_REFERRALS,0);

Ohne die habe ichs nicht hingekriegt ^^
viel spass
Member: Mean1312
Mean1312 Jun 19, 2007 at 11:37:29 (UTC)
Goto Top
Hi sihelpdesk,

danke für den Tipp - muß das aber doch hinter den connect setzen -> sonst habe ich das $ldapconn ja noch nicht?!?! Hab's übrigens schon in der gefundenen Klasse drin stehen... ;)

Noch eine Frage: Und zwar liest er mir die Benutzer nur dann aus, wenn ich ihn bei mind. 2 Gruppen eingetragen habe. Kann ich das irgendwie umgehen?

Zu deinem Filter noch eine Frage: mit $userid meinst du doch einen Namen, im Aufbau meines Login-Namens (wenn ich z.B. mich in der AD suche, dann mache ich dh@domain.test?!?!) weil irgendwie findet er da nie was...

Wenn ich es so mache: $filter = "(&(|(objectClass=user))(objectCategory=person)(cn=Vorname Nachname))"; dann findet er die Gruppenzugehörigkeiten. Ich will aber ja, daß sich die User mit ihrem Windows-Login einloggen können - also müßte ich schon die $userid nehmen...

Danke und Grüße,

Dirk
Member: sihelpdesk
sihelpdesk Jun 19, 2007 at 11:43:58 (UTC)
Goto Top
Hi Dirk

Wegen dem Filter:
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(samaccountname=".$userid."))";  
smaaccountname steht für den effektiven LOGIN-Namen (Der Anmeldename beim Logon)

Hier findest du die Feldbezeichnungen von ADS Objekten:
http://www.faq-o-matic.net/content/view/60/45/

Wegen deiner Frage betreffend den Gruppen.
Du hast geschrieben: "Und zwar liest er mir die Benutzer nur dann aus, wenn ich ihn bei mid. 2".
Mit diesem Vorgehen liest du ja keine Benutzer aus, sondern nur die Gruppen des Benutzers.

Lg.
Member: Mean1312
Mean1312 Jun 20, 2007 at 07:34:17 (UTC)
Goto Top
Hi,

habe die Attribut-Bezeichnung für den Benutzernamen gefunden. Das Zauberwort heißt "userPrincipalName" - falls nochmal jemand per Suchfunktion danach sucht... ;)

Grüße,

Dirk