[php] wachtwoord via ldap controleren

Pagina: 1
Acties:
  • 266 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Ik hoop dat er hier wat mensen zitten die ons kunnen helpen :)

We hebben een ldap server draaien (onder linux) en daarop ook apache. Nu willen wij een php script schrijven die het wachtwoord kan controleren uit de database (waarvoor wij een ldif bestand gebruiken). We hebben veel gezocht op internet, maar de juiste oplossing zit er niet tussen. Ik wil dus een inlogapplicatie maken in php.
Het ldif bestand heeft de volgende indeling (ingekort):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
dn: dc=ictbeheer,dc=nl
objectClass: top
objectclass: dcObject
objectclass: organization
dc: ictbeheer
o: ictbeheer
description: ICT beheers domein Saxion

dn: o=ictbeheer, c=nl
objectClass: top
objectClass: organization
o: ictbeheer
description: Afdeling ICT beheer

dn: cn=ictadmin,o=ictbeheer,c=nl
objectClass: organizationalRole
cn: ictadmin
description: LDAP Directory Administrator

dn: ou=TI,o=ictbeheer,c=nl
ou: TI
#o: ictbeheer
objectClass: top
objectClass: organizationalUnit
description: Members of Technische Informatica 

dn: ou=group,o=ictbeheer,c=nl
ou: group
#o: ictbeheer
objectClass: top
objectClass: organizationalUnit
description: Authorisation groups

dn:ou=IT2B2,ou=TI,o=ictbeheer,c=nl 
ou: IT2B2 
#associateddomain: IT2B2.TI.ictbeheer.nl  
objectClass: top
objectClass: organizationalUnit
description: PGO groep TI 
#objectClass: domainRelatedObject

dn: cn=Kai xxx,ou=IT2B2,ou=TI,o=ictbeheer,c=nl
ou: IT2B2
cn: Kai xxx
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
mail: kai@hotmail.com
givenname: Kai xxx
sn: xxx
homePostalAddress: xxx
l: xxx
st: xxx
postalcode: 3456
telephoneNumber: (800)555-1214
title: Problem manager ICT Beheerder
userPassword: {SSHA}FxX5R3U/WmeKApvjxxp/3eXQKtfY2UTp
uid: kai

dn: cn=Mathijn xxx,ou=IT2B2,ou=TI,o=ictbeheer,c=nl
ou: IT2B2
cn: Mathijn xxx
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
mail: mat@hotmail.com
givenname: Mathijn
sn: xxx
homePostalAddress: xxx
l: xxx
st: xxx
postalcode: xxx
telephoneNumber: xxx
title: CMBD manager ICT Beheerder
userPassword: {SSHA}hfB0BLhEy0/zwsZucOCmtxQ2zwtPFrTJ
uid: mathijn

dn: cn=IT2B2-pgo,ou=group,o=ictbeheer,c=nl 
cn: IT2B2-pgo
objectclass: groupOfNames
member: cn=Kai xxx,ou=IT2B2,ou=TI,o=ictbeheer,c=nl
member: cn=Mathijn xxx,ou=IT2B2,ou=TI,o=ictbeheer,c=nl


We hebben nu een gedeelte wat waarschijnlijk niet klopt, maar tis een opzet iig.
Nu moet daarin dus een simpel formulier komen waar je gebruikersnaam en wachtwoord kunt invullen. Vervolgens moet hij dit controleren met gegevens uit de database.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// connect to LDAP server
$ldap = ldap_connect("localhost") or die("Cannot connect to the ldap
server :/");
$oudc = "cn=IT2B2-pgo, dc=ictbeheer,dc=nl";
$searchdc = "dc=ictbeheer,dc=nl";
$dn2 = "";
$password = "userPassword";
$auth = false;
//look up OU
if (!($res = ldap_bind($ldap,$dn2,$password)))
{
  print(ldap_error($ldap) . "<br>");
  die("Could not bind to $dn");
}
else
{
  // set search critia for OU
  $filter = "samaccountname=".$_POST['username'];
  // search OU
  $sr = ldap_search($ldap,$searchdc,$filter);
  if (!$sr)
  {
    die("search failed\n");
  }
  else
  {
    // get fields from search
    $info = ldap_get_entries($ldap,$sr);
    if ($info["count"] == 0)
    {
      $auth = false;
    }
    else
    {
      $auth = true;
      $user_cn = $info[0]["cn"][0];
    }
    // disconnect from LDAP server
    ldap_unbind($ldap);
  }
}
if ($auth == false)
{
  die("Could not authenticate you to the Server.");
}
$ldap = ldap_connect("localhost") or die("Cannot connect to AD server :/");
$oudc = "cn=IT2B2-pgo, dc=ictbeheer,dc=nl";
$dn2 = "cn=".$user_cn.", ".$oudc;
$password = $_POST['password'];

//look up OU
if (!($res = ldap_bind($ldap,$dn2,$password)))
{
  $login = 0;
  $message = "Invalid Password.";
}
else
{
  $sr = ldap_search($ldap,"dc=ictbeheer,dc=nl","cn=".$user_cn);
  $info = ldap_get_entries($ldap,$sr);
  $login = 1;
  $message = "You have successfully logged in.<br>
}


Ik hoop dat jullie ons verder kunnen helpen want we zitten behoorlijk vast hierop.

edit: code tags door php tags vervangen ;)

[ Voor 10% gewijzigd door matel op 22-04-2004 21:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kun je iets duidelijker zijn? Ik kan uit je start post niet echt duidelijk opmaken wat er nou mis gaat, en "veel gezocht op internet" is me ook wat vaag. Kun je misschien aangeven wat er precies mis gaat, en wat je al geprobeerd hebt om het op te lossen? Hier kan ik helaas bar weinig mee :)

Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Je kunt denk ik beter vragen: wat gaat er niet mis? ;)
We hebben ook een aantal dingen getest. Ik kan niet precies aangeven wat we hebben gedaan omdat het waarschijnlijk toch nergens op slaat ;) En met "veel gezocht op internet" moet je verstaan het zoeken naar scripts, het testen daarvan, aanpassen enz.

Het ldap gedeelte werkt iig 100%. Daar hoeft dus niet naar gekeken te worden.
Er moet alleen nog een inlogapplicatie komen die het wachtwoord kan controleren uit de database. Dat is alles :D

Acties:
  • 0 Henk 'm!

Verwijderd

Je kan ook de mod_auth_ldap van apache gebruiken...

met de code tags hier op 't forum kan je meegeven wat voor taal het is...voor php doet hij dan ook highlighting...

[ Voor 56% gewijzigd door Verwijderd op 22-04-2004 14:38 ]


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Dit lijkt mij een php-kwestie, meer iets voor p&w dus :)
nos -> p&w

Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Wij zijn nu de verschillende mogelijkheden aan het afgaan en zijn idd langs mod_auth_ldap gekomen. Ik ben hier zelf niet mee aan het testen geweest, maar kan alleen zeggen dat het tot nu toe zonder succes was.

Volgens de opdracht die wij moeten maken moet het wel in een programmeertaal gemaakt zijn, die loginapplicatie. Maakt niet uit wat voor taal, maar wij dachten dat php het makkelijkste zou zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Zo heb ik heb aangepakt. Het voordeel is dat wij nu ook direct op de emailserver (imap) in kunnen loggen, omdat voor alle diensten dezelfde gebruikersnaam en hetzelfde wachtwoord gebruikt kan worden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   //
   // login loopt via ldap, zodat de gebruikers een single-sign-on uitvoeren
   //
   $ldap_connection = ldap_connect("ldap://" . $GLOBALS["_CONFIG"]["ldap"]["host"]) ;
   @ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) ;
   $bound = ldap_bind($ldap_connection, $GLOBALS["_CONFIG"]["ldap"]["username"], $GLOBALS["_CONFIG"]["ldap"]["password"]);

   if(strlen(strtolower(trim($_SERVER["PHP_AUTH_USER"]))) > 2)
    {
     // hier zoeken we de gebruikers op  
     $ldap_result = ldap_search($ldap_connection, "ou=clustergebruikers, o=electus, c=nl", "uid=evo" . strtolower(trim($_SERVER["PHP
_AUTH_USER"])));
     $ldap_entries = ldap_get_entries($ldap_connection, $ldap_result);
    }
   
   if(isset($_SERVER["PHP_AUTH_PW"]) != false && strlen(trim($_SERVER["PHP_AUTH_PW"])) > 0)
    {
     // ldap compatible wachtwoord samenstellen voor inloggegevens
     $ldap_password = "{MD5}" . base64_encode(pack("H*", md5($_SERVER["PHP_AUTH_PW"])));
    }

   // nu de zoekresultaten doorlopen of er een wachtwoord bestaat dat overeenkomt met de inloggegevens
   if(isset($ldap_entries) != false && count($ldap_entries) > 0)
    {
     for($i = 0; $i < count($ldap_entries); $i++)
      {
       if(isset($ldap_entries[$i]["userpassword"]["count"]) != false && $ldap_entries[$i]["userpassword"]["count"] > 0)
        {
         $passwords = array();
         for($j = 0; $j < $ldap_entries[$i]["userpassword"]["count"]; $j++)
          {
           @array_push($passwords, $ldap_entries[$i]["userpassword"][$j]);
          }

         if(in_array($ldap_password, $passwords) != false && is_numeric($ldap_entries[$i]["uidnumber"][0]) != false) 
          { 
           if(isset($ldap_entries[$i]["niveau"]) != false && $ldap_entries[$i]["niveau"]["count"] > 0)
            {

Als dit je niet verder helpt ;)

Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Bedankt voor je antwoord :) Ik krijg nu alleen een melding:
Parse error: parse error, unexpected $ in /home/httpd/vhosts/manylinks.nl/httpdocs/loginscript.php on line 40
Ik heb 2 keer MD5 vervangen voor SSHA omdat wij die encryptie gebruiken voor de wachtwoorden in ldif.

Het stukje "ou=clustergebruikers, o=electus, c=nl", "uid=evo" heb ik vervangen door "ou=group, o=ictbeheer, c=nl", "uid=mathijn" wat zou moeten werken voor onze database.

Acties:
  • 0 Henk 'm!

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Matel schreef op 23 april 2004 @ 11:51:
Bedankt voor je antwoord :) Ik krijg nu alleen een melding:


[...]


Ik heb 2 keer MD5 vervangen voor SSHA omdat wij die encryptie gebruiken voor de wachtwoorden in ldif.

Het stukje "ou=clustergebruikers, o=electus, c=nl", "uid=evo" heb ik vervangen door "ou=group, o=ictbeheer, c=nl", "uid=mathijn" wat zou moeten werken voor onze database.
Misschien handig om even je code te posten? Met alleen de melding dat er op regel 40 iets fout zit kunnen we (in ieder geval ik ;) ) erg weinig doen namelijk :)

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Ik had alleen wat aangepast en gezegt wat ik had aangepast ;) Maar goed, hier is de code :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?
   // 
   // login loopt via ldap, zodat de gebruikers een single-sign-on uitvoeren 
   // 
   $ldap_connection = ldap_connect("ldap://nitrate.ath.cx:386" . $GLOBALS["_CONFIG"]["ldap"]["host"]) ; 
   @ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) ; 
   $bound = ldap_bind($ldap_connection, $GLOBALS["_CONFIG"]["ldap"]["username"], $GLOBALS["_CONFIG"]["ldap"]["password"]); 

   if(strlen(strtolower(trim($_SERVER["PHP_AUTH_USER"]))) > 2) 
    { 
     // hier zoeken we de gebruikers op   
     $ldap_result = ldap_search($ldap_connection, "ou=group, o=ictbeheer, c=nl", "uid=mathijn" . 

strtolower(trim($_SERVER["PHP 
_AUTH_USER"]))); 
     $ldap_entries = ldap_get_entries($ldap_connection, $ldap_result); 
    } 
    
   if(isset($_SERVER["PHP_AUTH_PW"]) != false && strlen(trim($_SERVER["PHP_AUTH_PW"])) > 0) 
    { 
     // ldap compatible wachtwoord samenstellen voor inloggegevens 
     $ldap_password = "{SSHA}" . base64_encode(pack("H*", ssha($_SERVER["PHP_AUTH_PW"]))); 
    } 

   // nu de zoekresultaten doorlopen of er een wachtwoord bestaat dat overeenkomt met de inloggegevens 
   if(isset($ldap_entries) != false && count($ldap_entries) > 0) 
    { 
     for($i = 0; $i < count($ldap_entries); $i++) 
      { 
       if(isset($ldap_entries[$i]["userpassword"]["count"]) != false && $ldap_entries[$i]["userpassword"]["count"] > 0) 
        { 
         $passwords = array(); 
         for($j = 0; $j < $ldap_entries[$i]["userpassword"]["count"]; $j++) 
          { 
           @array_push($passwords, $ldap_entries[$i]["userpassword"][$j]); 
          } 

         if(in_array($ldap_password, $passwords) != false && is_numeric($ldap_entries[$i]["uidnumber"][0]) != false) 
          { 
           if(isset($ldap_entries[$i]["niveau"]) != false && $ldap_entries[$i]["niveau"]["count"] > 0) 
            {
?>

Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Klopt het trouwens dat je ook ldap nog moet compileren in php omdat het anders niet werkt? Ik probeer via internet verbinding te maken met de ldap server.

Acties:
  • 0 Henk 'm!

Verwijderd

Krijg een aantal errors

Resource id #1

Warning: ldap_search(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 59

Warning: ldap_first_entry(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 60

Warning: ldap_free_result(): supplied argument is not a valid ldap result resource in SYS:/Apache2/htdocs/qadsens.php on line 85

Warning: ldap_unbind(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 86

Na een submit probeer ik weer resource id# 1 te gebruiken. Weet iemand waarom dit niet lukt. Ik stuur $ldapLink in en een hidden field binnen een form.
Met $_POST['ldapLink'] wil ik dus verder gaan.

[ Voor 152% gewijzigd door Verwijderd op 23-10-2004 04:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 15 oktober 2004 @ 20:55:
Krijg een aantal errors

Resource id #1

Warning: ldap_search(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 59

Warning: ldap_first_entry(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 60

Warning: ldap_free_result(): supplied argument is not a valid ldap result resource in SYS:/Apache2/htdocs/qadsens.php on line 85

Warning: ldap_unbind(): supplied argument is not a valid ldap link resource in SYS:/Apache2/htdocs/qadsens.php on line 86


Na een submit probeer ik weer resource id# 1 te gebruiken. Weet iemand waarom dit niet lukt. Ik stuur $ldapLink in en een hidden field binnen een form.
Met $_POST['ldapLink'] wil ik dus verder gaan.
Pagina: 1