2013-05-31 122 views
1

我正嘗試使用PHP和LDAP對Active Directory進行身份驗證。不幸的是,當我嘗試通過表單發送用戶名時,它失敗了。即使我在authenticate函數中指定了$ userName和$ passWord,該函數仍會返回false。我究竟做錯了什麼?通過PHP進行LDAP身份驗證仍然失敗

PHP:

<?php 
session_start(); 
function authenticate($userName,$passWord) { 

//Active Directory Server 
$ldap_host = "example.com"; 

//Active Directory DN 
$ldap_dn = "DC=myCompany,DC=org"; 

//Connect to AD Server 
$ldap = ldap_connect($ldap_host) 
    or die("Could not connect to LDAP server."); 
utf8_decode($passWord); 

//Specify Active Directory 
ldap_set_option ($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 

//Verify userName and passWord 
if($bind = @ldap_bind($ldap, $userName, $passWord)) { 
    //if valid 
    $ldapResults = 'Bind Successful'; 
    return true;   
} else { 
    //invalid username or password 
    return false; 
} 
}; 
if(isset($_POST['userName'])) { 
//authenticate via function 
if(authenticate($_POST['userName'],$_POST['passWord'])) 
{ 
    //successfully authenticated (scroll down) 
    header("Location: example.com"); 
    $error = null; 
} else { 
    //failed authentication 
    $error = 1; 
} 
} 
?> 

HTML:

<form method="post" id="loginForm" action="login.php"> 
      <ul> 
       <li> 
        <input type="text" id="userName" name="userName" /> 
       </li> 
       <li> 
        <input type="password" id="passWord" name="passWord" /> 
       </li> 
       <li> 
        <input type="submit" name="submit" value="Log In"></input> 
       </li> 
      </ul> 
</form> 
+0

您可以從'ldap_bind()'調用的開頭刪除@,以便查看它是否生成任何錯誤。 – andrewsi

+0

試過了,沒有運氣。 – beta208

+1

你從'ldap_errno()'得到了什麼嗎? – andrewsi

回答

0

正如你似乎可以用一個ActiveDirectory的認證對,你可以使用[email protected]作爲用戶名,而不是myDomain\\username。發現在this answer

您還應該能夠提供ldap_bind功能的完整DN。

因此,您必須將其鍵入userName字段,或者使用與已知(或匿名)用戶的第二個綁定來獲取給定用戶名的DN,以將其用於最終綁定。

我剛剛砍了一個example gist來說明這一點。在第13行中,您有第一個綁定來檢索用戶的DN,並且在第70行中,您使用檢索到的DN和提供的密碼來檢查憑證,從而獲得最終綁定。兩者之間的一切都是簡單的檢查錯誤。

相關問題