2011-11-30 75 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

感謝您的信息克里斯。你的評論總是有道理的。當我有幾個小時殺人時,我會試試這個。 –

相關問題