2011-11-30 81 views
3

当我只有SamAccountName和Password时,如何使用LDAP从PHP进行身份验证?有没有一种方法来绑定只有SamAccountName和密码,没有专有名称。我发现的唯一示例假设您拥有DN:仅使用SamAccountName和Password验证来自PHP的来自PHP的用户身份?

$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"]; 

回答

3

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

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

0

您总是需要DN来验证LDAP服务器。之后,您可以基于特定属性(如SamAccountName)执行过滤器,但需要由DN标识的LDAP用户。

+0

必须在DN中始终有一个用户名或cn?是否有可能让代理用户进行身份验证,然后搜索samAccountName和密码? – user840930

+0

或者有没有办法找到DN,尤其是SamAccountName的用户名? – user840930

+0

通常,如果您不知道用户DN,则必须使用有效的LDAP用户(如您所说的代理用户)进行身份验证。您应遵循以下步骤:1.-使用代理用户进行身份验证,2.在筛选器中使用SamAccountName搜索真实用户,3.检索真实用户DN,4.使用检索到的用户DN和您拥有的密码再次进行身份验证 –

0

到AD的LDAP接口要求您使用DN进行绑定。为了验证用户,您必须先找到该用户的DN--幸运的是,您可以通过搜索LDAP来查找DN。

如果configure AD to allow anonymous queries(不这样做,除非你确信你真行,在安全的减少),你可以做

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

,然后检索该用户的DN并着手进行重新绑定用户的DN和密码。

如果你启用匿名绑定,然后使用一个应用程序ID做初步搜索,就像这样:

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

然后,如上文刚,获取该用户的DN并继续重新绑定。

2

在dn上尝试user @ domain ...它对我有效!

8

这适用于我。我花了很多天试图弄清楚这一点。

<?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>"); 
} 
?> 
+0

所有这些工作,并没有足够的upvotes。这是非常有用的。 –

+2

我看到这很多:首先用“功能账户”登录,查询数据,然后绑定到登录的实际用户。在我看来这是一个不好的做法 - 安全明智。拥有功能账户的密码几乎从不改变是不好的。您可以直接与登录的用户绑定,然后在该会话中进行查询。我从来没有见过一个AD,用户不允许查询自己的数据。对于AD,您必须绑定“userPrincipalName”或“domain \ sAMAccountName”(完整的用户DN也应该有效)。只是我2美分。仍然你的解决方案是有帮助的,我会给你一个upvote。 – Chris

+0

感谢您的信息克里斯。你的评论总是有道理的。当我有几个小时杀人时,我会试试这个。 –

相关问题