仅使用SamAccountName和Password从PHP使用LDAP验证用户?

use*_*930 6 php ldap

当我只有SamAccountName和密码时,如何使用LDAP从PHP进行身份验证?有没有办法绑定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"]; 
Run Code Online (Sandbox Code Playgroud)

Dan*_*phy 15

这适合我.我花了很多天试图弄清楚这个.

<?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>");   
} 
?>
Run Code Online (Sandbox Code Playgroud)

  • 我看到了很多:首先使用"功能帐户"登录,查询数据然后与登录的实际用户绑定.在我看来这是一种不好的做法 - 安全明智.拥有几乎从不改变密码的功能帐户是不好的.您可以直接与登录的用户绑定,然后在该会话中进行查询.我从未见过不允许用户查询自己数据的AD.对于AD,您必须绑定"userPrincipalName"或"domain\sAMAccountName"(完整的用户DN也应该工作).只需2美分.你的解决方案仍然有用,我会给你一个upvote. (6认同)
  • 我也认为这是不好的做法,但我对如何使用samaccountname执行绑定毫无头绪.domain\samaccountname被openldap拒绝.我该怎么做? (3认同)

use*_*930 6

实际上,答案是它取决于管理员如何配置LDAP服务器.您并不总是需要DN来对LDAP服务器进行身份验证.在我的特定情况下,即使使用DN,我仍然无法对LDAP服务器进行身份验证.对于我尝试连接的LDAP服务器,它似乎是一个Microsoft域,因此我只能使用DOMAIN\user015对DOMAIN中的user015进行身份验证,其中user015是SamAccountName,DOMAIN是该用户的域.但我能够进行身份验证.

谢谢你的所有帖子!即使他们不是正确答案,他们确实帮了很多忙!