2008-10-05 194 views
93

我正在尋找一種通過LDAP(使用Active Directory作爲提供程序)通過LDAP對用戶進行身份驗證的方法。理想情況下,它應該能夠在IIS 7上運行(adLDAP在Apache上運行)。任何人都做過類似的事情,取得成功?在PHP中使用LDAP進行身份驗證通過Active Directory

  • 編輯:我更喜歡有代碼的圖書館/班級準備好去...當有人已經這樣做時,發明輪子會很愚蠢。
+0

我認爲drupal有一個模塊用於登錄 – redben 2010-06-20 11:29:03

回答

147

導入全庫似乎效率不高時,所有你需要的是本質上的兩行代碼...

$ldap = ldap_connect("ldap.example.com"); 
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) { 
    // log them in! 
} else { 
    // error message 
} 
+37

如果提供的密碼爲空,某些安裝的AD將成功綁定。當心這個!在嘗試進行身份驗證之前,您可能需要確保非空密碼。 – diolemo 2011-10-20 16:32:55

+0

@diolemo有沒有什麼辦法可以防止這種情況而不檢查密碼是否爲空? – Neal 2013-10-14 22:00:07

8

我喜歡類,你可以在你的項目中只使用這個類,沒有Zend Framework。

11

我只需將用戶憑據傳遞給ldap_bind()即可完成此操作。

http://php.net/manual/en/function.ldap-bind.php

如果賬戶可以綁定到LDAP,它是有效的;如果它不能,那不是。如果你所做的只是認證(不是賬戶管理),我不認爲需要一個庫。

11

你會認爲,只需在Active Directory中對用戶進行身份驗證就可以非常簡單地在PHP中使用LDAP,而無需庫。但是有很多東西可能使其複雜化很快:

  • 您必須驗證輸入。一個空的用戶名/密碼會通過其他方式。
  • 您應確保在綁定時正確編碼用戶名/密碼。
  • 您應該使用TLS加密連接。
  • 使用單獨的LDAP服務器進行冗餘備份,以防萬一。
  • 如果驗證失敗,則獲取信息性錯誤消息。

在大多數情況下,使用支持上述內容的LDAP庫實際上更容易。我最終結束了自己的庫,處理所有上述要點:LdapTools(好吧,不只是爲了驗證,它可以做更多)。它可用於如下所示:上述

use LdapTools\Configuration; 
use LdapTools\DomainConfiguration; 
use LdapTools\LdapManager; 

$domain = (new DomainConfiguration('example.com')) 
    ->setUsername('username') # A separate AD service account used by your app 
    ->setPassword('password') 
    ->setServers(['dc1', 'dc2', 'dc3']) 
    ->setUseTls(true); 
$config = new Configuration($domain); 
$ldap = new LdapManager($config); 

if (!$ldap->authenticate($username, $password, $message)) { 
    echo "Error: $message"; 
} else { 
    // Do something... 
} 

的authenticate呼叫將:

  • 驗證是,無論是用戶名或密碼爲空。
  • 確保用戶名/密碼被正確編碼(默認情況下爲UTF-8)
  • 嘗試備用LDAP服務器以防止其中一個出現故障。
  • 使用TLS加密認證請求。
  • 提供更多的信息,如果它失敗(即鎖定/禁用的帳戶等)

還有其他圖書館也需要這樣做(如Adldap2)。然而,我覺得有必要提供一些額外的信息,因爲最有投票權的答案實際上是一個安全風險,依賴於沒有輸入驗證而不使用TLS。

相關問題