PHP Loginscript für (LDAP) Activedirectory Benutzer
Mit PHP prüfen, ob Passwort und Benutzer mit Activedirectory übereinstimmen mit Hilfe von LDAP.
Moin!
Nach dem ich nun 3 Tage und Nächte das gesamt Internet durchwühlt habe um ein Loginscript für PHP zu schreiben, der Benutzer das eingegeben Passwort mit dem Activedirectory von WIN2k überprüft, habe ich mir gedacht das es sinnvoll sein kann, es hier zu posten.
Es ist eine einfache Funktion die true zurück gibt, wenn name und Passwort übereinstimmen und False, wenn nicht.
Mit $username und $passwort werden die Daten angegeben, die überprüft werden sollen.
[Dein Server] ist der Servername
[sitename] ist die Domäne, wie hier Administrator
[sitesuffix] ist die TDL wie DE oder local
Ich hoffe, jemanden damit weitergeholfen zu haben.
Moin!
Nach dem ich nun 3 Tage und Nächte das gesamt Internet durchwühlt habe um ein Loginscript für PHP zu schreiben, der Benutzer das eingegeben Passwort mit dem Activedirectory von WIN2k überprüft, habe ich mir gedacht das es sinnvoll sein kann, es hier zu posten.
Es ist eine einfache Funktion die true zurück gibt, wenn name und Passwort übereinstimmen und False, wenn nicht.
Mit $username und $passwort werden die Daten angegeben, die überprüft werden sollen.
[Dein Server] ist der Servername
[sitename] ist die Domäne, wie hier Administrator
[sitesuffix] ist die TDL wie DE oder local
<?>
function checkNTUser ($username,$passwort)
{
$ldapserver = '[Dein Server]';
$ds=ldap_connect($ldapserver);
if ($ds)
{
$dn="cn=$username,cn=Users, DC=[sitename], DC=[sitesuffix]";
$r=@ldap_bind($ds,$dn,$passwort);
if ($r)
{
return true;
}
else
{
return false;
}
}
}</?>
Please also mark the comments that contributed to the solution of the article
Content-ID: 31891
Url: https://administrator.de/contentid/31891
Printed on: December 14, 2024 at 16:12 o'clock
16 Comments
Latest comment
Hallo zusammen,
so, ich habe rausgefunden, wie man sich das AD-Schema anzeigen lassen kann (mit allen Feldern).
#1 ResourceKit downloaden
http://www.microsoft.com/downloads/details.aspx?displaylang=en&fami ...
#2 RKTools installieren
#3 schmmgmt.dll registrieren
regsvr32 schmmgmt.dll
#4 Start -> Ausführen
mmc /a
#5 Datei -> Snap-In Hinzufügen
"Active Directory Schema" hinzufügen
#6 Speichern unter %systemroot%system32
schmmgmt.msc
Hier kann man sich das AD komplett anschauen, alle Felder...
mfg Nils
so, ich habe rausgefunden, wie man sich das AD-Schema anzeigen lassen kann (mit allen Feldern).
#1 ResourceKit downloaden
http://www.microsoft.com/downloads/details.aspx?displaylang=en&fami ...
#2 RKTools installieren
#3 schmmgmt.dll registrieren
regsvr32 schmmgmt.dll
#4 Start -> Ausführen
mmc /a
#5 Datei -> Snap-In Hinzufügen
"Active Directory Schema" hinzufügen
#6 Speichern unter %systemroot%system32
schmmgmt.msc
Hier kann man sich das AD komplett anschauen, alle Felder...
mfg Nils
Hallo.
Ich habe das ganze noch ein bisschen erweitert:
Die Funktion gibt ein Array zurück, mit dem Benutzernamen, Passwort, Der Connect-Meldung und ob das login erfolgreich war (oder die Fehldermeldungen).
In den übrigen Dokumenten frage ich dann einfach immer nur noch das ab:
Die Bereiche, die nur eingeloggt angezeigt werden dürfen, kommen in folgendes:
Das echo $login_complete gibt die Meldung zurück (also z.B. Sie sind nicht eingeloggt o.ä.)
Der Inhalt, der nur eingeloggt angezeigt werden kann, ist im THEN-teil (oberer Teil), also hier kommt dann: "Sie sind eingeloggt als Muster.Hans"
(Eingeloggt = login erfolgreich)
Der Teil der nur bei nicht eingeloggtem Status angezeigt werden soll ist im ELSE-teil
(Hier kommt das Login)
Wenn man auf "Login" klickt (Formular absenden) kehrt man wieder auf dieselbe Seite zurück (mithilfe der Variable $file, schreibe zu der später noch einen Kommentar dazu )
Dieser Codeblock (if($login_check==true) {} else {}) kann man überall einbinden wo man will (ausser natürlich vor dem Aufrufen der Funktion), also kann man z.B. in der Navi bestimmte Punkte ausblenden / einblenden und gleichzeitig auch beim Inhalt etwas verbieten.
Das echo $login_complete würde ich auch immer gerade dazuschreiben, da man sonst nicht weiss ob man nicht alle Felder ausgefüllt hat, oder ob man das Passwort falsch eingegeben hat, oder ob man nicht eingeloggt ist. Sonst weiss man am Schluss nicht mal das es noch mehr Inhalte hat, einfach erst nach dem einloggen =).
--Bei Verbersserungsvorschlägen, einfach melden--
Greetz, Lousek
Ich habe das ganze noch ein bisschen erweitert:
function login_complete ($ldap_server)
{
if((isset($_COOKIE['cookie_username']) AND ($_COOKIE['cookie_passwort']))) {
$username = $_COOKIE['cookie_username'];
$passwort = $_COOKIE['cookie_passwort'];
$check_positive = 1;
} else {
if((isset($_POST['username']) OR ($_POST['passwort']))) {
if(empty($_POST['username']) OR empty($_POST['passwort'])) {
$array["login_complete"] = "Bitte fuellen Sie alle Felder aus. <br>";
} else {
if((isset($_POST['username']) AND ($_POST['passwort']))) {
$username = $_POST['username'];
$passwort = $_POST['passwort'];
$check_positive = 1;
}
}
} else {
$array["login_complete"] = "Sie sind nicht eingeloggt: ";
}
}
if($check_positive==1) {
//----------------------------------------Login und Bind----------------------------------------
if (!($connect=@ldap_connect($ldap_server))) {
$array["login_complete"] = "Could not connect to ldap server<br>";
} else {
}
// Needed for W2003 AD..
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
if (!($bind=@ldap_bind($connect, $username, $passwort))) {
$array["login_complete"] = "Login oder Passwort falsch. <br>";
} else {
setcookie("cookie_passwort", $passwort, time()+(60*60));
setcookie("cookie_username", $username, time()+(60*60));
$array["login_check"] = true;
}
}
$array["username"] = $username;
$array["passwort"] = $passwort;
$array["connect"] = $connect;
return $array;
}
Die Funktion gibt ein Array zurück, mit dem Benutzernamen, Passwort, Der Connect-Meldung und ob das login erfolgreich war (oder die Fehldermeldungen).
In den übrigen Dokumenten frage ich dann einfach immer nur noch das ab:
include "variables.php";
include "functions.php";
$login = login_complete ($ldap_server);
$login_complete = $login["login_complete"];
$username = $login["username"];
$passwort = $login["passwort"];
$login_check = $login["login_check"];
$connect = $login["connect"];
Die Bereiche, die nur eingeloggt angezeigt werden dürfen, kommen in folgendes:
echo $login_complete;
if($login_check==true) {
echo " Sie sind eingeloggt als: ".$username;
} else {
echo "<form action='$file' method='POST'>";
echo "Benutzername:<br>";
echo "<input type='text' value='Benutzername' name='username'><br>";
echo "Passwort:<br>";
echo "<input type='password' name='passwort'><br>";
echo "<input type='submit' value='login' name='submit'<br>";
}
Das echo $login_complete gibt die Meldung zurück (also z.B. Sie sind nicht eingeloggt o.ä.)
Der Inhalt, der nur eingeloggt angezeigt werden kann, ist im THEN-teil (oberer Teil), also hier kommt dann: "Sie sind eingeloggt als Muster.Hans"
(Eingeloggt = login erfolgreich)
Der Teil der nur bei nicht eingeloggtem Status angezeigt werden soll ist im ELSE-teil
(Hier kommt das Login)
Wenn man auf "Login" klickt (Formular absenden) kehrt man wieder auf dieselbe Seite zurück (mithilfe der Variable $file, schreibe zu der später noch einen Kommentar dazu )
Dieser Codeblock (if($login_check==true) {} else {}) kann man überall einbinden wo man will (ausser natürlich vor dem Aufrufen der Funktion), also kann man z.B. in der Navi bestimmte Punkte ausblenden / einblenden und gleichzeitig auch beim Inhalt etwas verbieten.
Das echo $login_complete würde ich auch immer gerade dazuschreiben, da man sonst nicht weiss ob man nicht alle Felder ausgefüllt hat, oder ob man das Passwort falsch eingegeben hat, oder ob man nicht eingeloggt ist. Sonst weiss man am Schluss nicht mal das es noch mehr Inhalte hat, einfach erst nach dem einloggen =).
--Bei Verbersserungsvorschlägen, einfach melden--
Greetz, Lousek
Moinsen Simon
Habe es hier hochgeladen: http://hubusoft.5x.to/login.rar
Hat noch ein paar unnötige Dinge drinn, hatte nur mal etwas daran rumgebastelt, nie produktiv gebraucht ... bei mir ging es so ...
Irgendwo sollte ich noch eine Datei haben, die die Gruppenangehörigkeit überprüft ... werde die noch schnell suchen.
Greetz, Lousek
Edit: Die datei memberof.php stammt nicht vonmir, von der hab ich das ganze mit der Gruppenangehörigkeit "abgeschaut". In der marken.php habe ich einfach ein bisschen rumgebastelt ...
Habe es hier hochgeladen: http://hubusoft.5x.to/login.rar
Hat noch ein paar unnötige Dinge drinn, hatte nur mal etwas daran rumgebastelt, nie produktiv gebraucht ... bei mir ging es so ...
Irgendwo sollte ich noch eine Datei haben, die die Gruppenangehörigkeit überprüft ... werde die noch schnell suchen.
Greetz, Lousek
Edit: Die datei memberof.php stammt nicht vonmir, von der hab ich das ganze mit der Gruppenangehörigkeit "abgeschaut". In der marken.php habe ich einfach ein bisschen rumgebastelt ...
Bei so etwas muss ich immer wieder schmunzeln...
So ein LDAP Login ist jetzt nicht die große Herausforderung, was allerdings schon öfters gefragt wurde und nie wirklich beantwortet wurde:
Wie muss der LDAP-Filter aufgebaut sein um eine spezifische Gruppenmitgliedschaft prüfen zu können.
Eigentlich eine einfache Frage.
Quasi: ist [username] memberof [Administratoren] dann hätt ich gern ein true (oder was weis ich…)
Bin schon mal auf eure Kommentare gespannt…
Gruß
Rafael
Hallo.
Habe vor einiger Zeit ein Script geschrieben, dass alle User in einer Gruppe (und allen Untergruppen --> rekursiv) auflistet.
Werde morgen mal nachschauen, habe das Script nicht zu Hause und mein Hirn ist etwas eingerostet was LDAP angeht.
Grundsätzlich kannst du aber die Mitglieder eine Gruppe auslesen.
Dann könntest du diese ja selbst (also nicht direkt mit LDAP) mit deinem gewünschten Benutzer vergleichen.
Wenn du den ganzen DN (LDAP-Pfad) des Users hast (z.B. durch das Login), dann kannst du nachher diesen mit allen bekommenen Einträgen aus der "Gruppenmitgliedschafts"-Abfrage vergleichen ...
Sonst müsstest du evt. noch den DN herausfinden des Users, sprich im AD nach dem User suchen.
Greetz, Lousek
Habe vor einiger Zeit ein Script geschrieben, dass alle User in einer Gruppe (und allen Untergruppen --> rekursiv) auflistet.
Werde morgen mal nachschauen, habe das Script nicht zu Hause und mein Hirn ist etwas eingerostet was LDAP angeht.
Grundsätzlich kannst du aber die Mitglieder eine Gruppe auslesen.
Dann könntest du diese ja selbst (also nicht direkt mit LDAP) mit deinem gewünschten Benutzer vergleichen.
Wenn du den ganzen DN (LDAP-Pfad) des Users hast (z.B. durch das Login), dann kannst du nachher diesen mit allen bekommenen Einträgen aus der "Gruppenmitgliedschafts"-Abfrage vergleichen ...
Sonst müsstest du evt. noch den DN herausfinden des Users, sprich im AD nach dem User suchen.
Greetz, Lousek