Аутентификация пользователя с помощью LDAP из PHP только с SamAccountName и паролем? - PullRequest
6 голосов
/ 30 ноября 2011

как мне пройти аутентификацию из PHP с использованием LDAP, когда у меня есть только SamAccountName и пароль?Есть ли способ привязки только с SamAccountName и паролем и без отличительного имени.Единственные примеры, которые я нашел, предполагают, что у вас DN:

$server="XXX.XXX.XXX.XXX";
$dn = "cn=$username, "; 
$basedn="ou=users, ou=accounts, dc=domain, dc=com";

if (!($connect = ldap_connect($server))) { 
   die ("Could not connect to LDAP server"); 
} 

if (!($bind = ldap_bind($connect, "$dn" . "$basedn", $password))) {        
   die ("Could not bind to $dn"); 
} 

$sr = ldap_search($connect, $basedn,"$filter"); 
$info = ldap_get_entries($connect, $sr); 
$fullname=$info[0]["displayname"][0]; 
$fqdn=$info[0]["dn"]; 

Ответы [ 5 ]

15 голосов
/ 27 августа 2014

Это работает для меня.Я провел много дней, пытаясь понять это.

<?php

//We just need six varaiables here
$baseDN = 'CN=Users,DC=domain,DC=local';
$adminDN = "YourAdminDN";//this is the admin distinguishedName
$adminPswd = "YourAdminPass";
$username = 'Username';//this is the user samaccountname
$userpass = 'UserPass';
$ldap_conn = ldap_connect('ldaps://yourADdomain.local');//I'm using LDAPS here

if (! $ldap_conn) {
        echo ("<p style='color: red;'>Couldn't connect to LDAP service</p>");
    }
else {    
        echo ("<p style='color: green;'>Connection to LDAP service successful!</p>");
     }
//The first step is to bind the administrator so that we can search user info
$ldapBindAdmin = ldap_bind($ldap_conn, $adminDN, $adminPswd);

if ($ldapBindAdmin){
    echo ("<p style='color: green;'>Admin binding and authentication successful!!!</p>");

    $filter = '(sAMAccountName='.$username.')';
    $attributes = array("name", "telephonenumber", "mail", "samaccountname");
    $result = ldap_search($ldap_conn, $baseDN, $filter, $attributes);

    $entries = ldap_get_entries($ldap_conn, $result);  
    $userDN = $entries[0]["name"][0];  
    echo ('<p style="color:green;">I have the user DN: '.$userDN.'</p>');

    //Okay, we're in! But now we need bind the user now that we have the user's DN
    $ldapBindUser = ldap_bind($ldap_conn, $userDN, $userpass);

    if($ldapBindUser){
        echo ("<p style='color: green;'>User binding and authentication successful!!!</p>");        

        ldap_unbind($ldap_conn); // Clean up after ourselves.

    } else {
        echo ("<p style='color: red;'>There was a problem binding the user to LDAP :(</p>");   
    }     

} else {
    echo ("<p style='color: red;'>There was a problem binding the admin to LDAP :(</p>");   
} 
?>
5 голосов
/ 30 ноября 2011

На самом деле ответ таков: это зависит от того, как сервер LDAP был настроен администратором.Вам не всегда нужно DN для аутентификации на сервере LDAP.В моем конкретном случае, даже с DN, я все еще не мог пройти аутентификацию на сервере LDAP.Для сервера LDAP, который я пытался подключить, оказалось, что это был домен Microsoft, и поэтому я мог проходить аутентификацию только с DOMAIN \ user015 для user015 в DOMAIN, где user015 - это SamAccountName, а DOMAIN - это домен для этого пользователя.Но я смог подтвердить подлинность.

Спасибо за все сообщения!Даже если они не дали правильного ответа, они очень помогли!

4 голосов
/ 11 марта 2014

Попробуйте user @ domain на dn ... У меня это сработало!

0 голосов
/ 10 февраля 2014

Интерфейс LDAP для AD требует привязки с использованием DN. Для аутентификации пользователя вы должны сначала найти DN этого пользователя - к счастью, вы можете найти DN, выполнив поиск по LDAP.

Если вы настраиваете AD для разрешения анонимных запросов (не делайте этого, если вы не уверены, что вы согласны с уменьшением безопасности), вы можете сделать

ldap_bind($connect, "", "")
$sr = ldap_search($connect, $base_dn, "(sAMAccountName=$username)")

А затем получите DN этого пользователя и перейдите к повторной привязке с DN и паролем пользователя.

Если вы включите , а не , включите анонимное связывание, тогда вы будете использовать идентификатор приложения для начального поиска, например:

ldap_bind($connect, "DN=LDAP_App,OU=Users,DC=Domain,DC=com", "thePassword")
$sr = ldap_search($connect, $base_dn, "(sAMAccountName=$username)")

А затем, как и выше, получить DN этого пользователя и перейти к повторной привязке.

0 голосов
/ 30 ноября 2011

Вам всегда нужно DN для аутентификации на сервере LDAP. После этого вы можете выполнить фильтр на основе определенного атрибута, такого как SamAccountName, но вам нужен пользователь LDAP, идентифицируемый DN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...