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

仅使用SamAccountName和密码从PHP使用LDAP验证用户?,php,ldap,Php,Ldap,当我只有SamAccountName和密码时,如何使用LDAP从PHP进行身份验证?有没有一种方法可以只绑定SamAccountName和Password而不绑定可分辨名称。我发现的唯一示例假设您拥有DN: $server="XXX.XXX.XXX.XXX"; $dn = "cn=$username, "; $basedn="ou=users, ou=accounts, dc=domain, dc=com"; if (!($connect = ldap_connect($server)))

当我只有SamAccountName和密码时,如何使用LDAP从PHP进行身份验证?有没有一种方法可以只绑定SamAccountName和Password而不绑定可分辨名称。我发现的唯一示例假设您拥有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"]; 

您始终需要一个DN来对LDAP服务器进行身份验证。之后,您可以基于特定属性执行筛选,如SamAccountName,但您需要一个由DN标识的LDAP用户。

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


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

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

如果您(除非您确定您对安全性的降低感到满意,否则不要这样做),您可以这样做

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并继续重新绑定。

尝试user@domain关于dn。。。这对我有用

这对我很有用。我花了很多天试图弄明白这个问题

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

DN中必须始终有用户名或cn吗?是否有可能让代理用户只进行身份验证,然后搜索samAccountName和密码?或者是否有方法查找DN,特别是来自samAccountName的用户名?通常,如果您不知道用户DN,则必须使用有效的LDAP用户(如您所说,代理用户)进行身份验证。您应该遵循以下步骤:1.-使用代理用户进行身份验证,2.-在筛选器中使用SamAccountName搜索真实用户,3.-检索真实用户DN,4.-使用检索到的用户DN和您看到的密码再次进行身份验证。我是否可以进行匿名绑定,然后使用SamAccountName搜索用户的DN?这取决于LDAP服务器配置,但理论上是肯定的。出于安全原因,一些LDAP管理员不允许进行任意绑定,但您可以尝试。所有这些都可以,但没有足够的升级投票。这非常有用。我经常看到这一点:首先使用“功能帐户”登录,查询数据,然后与实际登录的用户绑定。在我看来,这是一个糟糕的做法-安全明智。拥有几乎永远不会更改密码的功能帐户是不好的。您可以直接与登录的用户绑定,然后在该会话中进行查询。我从来没有见过一个广告不允许用户查询自己的数据。对于AD,您必须使用“userPrincipalName”或“domain\sAMAccountName”进行绑定(完整的用户DN也可以使用)。只要我的2美分。不过你的解决方案还是有帮助的,我会给你一个投票。谢谢你的信息克里斯。你的评论完全有道理。当我有几个小时可以消磨的时候,我会尝试一下。我也认为这是一种不好的做法,但我不知道如何使用SamaAccountName进行绑定。openldap拒绝域\samaccountname。我该怎么做呢?我试过了,不管变量$username和$userpass是什么,ldap绑定用户总是成功执行的:(