Windows Server AD 是一個 LADP 伺服器,可讓您將資訊儲存在目錄服務中,在資料庫中進行查詢,並可以使用他來作為身份的認證授權。
使用PHP撰寫程式難免會遇到需要作身份認證的問題,除了自行撰寫這部份程式的選擇外,PHP 的函式庫中亦提供了標準的 LDAP 函式,如果公司組織中已經有架設 Windows 2K/2003 網域的環境 ,將身份認證的工作交由 Windows AD 亦是一個不錯的選擇。
在寫此程式前,請先到php.ini檔,打開php_ldap.dll的功能(預設是關閉的),否則執行時會出現未定義函數的錯誤訊息。(打開後記得要重啟apache服務,功能才會生效)
PHP可以一筆一筆撈出AD資料(ldap_first_entry / ldap_next_entry),然後將每一筆資料的欄位屬性解析出來(ldap_get_values)。
實作如下:
案例環境說明:
1.公司組織內有一個Windows 網域,名稱為: domain.com。
2.domain.com 的網域有兩部網域主控站(DC)分別為:dc.domain.com、dc2.domain.com。
3.PHP版本:5.2.1 由下載 AppServ 2.5.10 安裝
PHP程式碼範例:
$domain = 'domain.com'; //設定網域名稱 $dn="dc=domain,dc=com"; $user = 'administrator'; //設定欲認證的帳號名稱 $password = 'password'; //設定欲認證的帳號密碼 // 使用 ldap bind $ldaprdn = $user . '@' . $domain; // ldap rdn or dn $ldappass = $password; // 設定密碼 // 連接至網域控制站 $ldapconn = ldap_connect($domain) or die("無法連接至 $domain"); // 如果要特別指定某一部網域主控站(DC)來作認證則上面改寫為 //$ldapconn = ldap_connect('dc.domain.com) or die("無法連接至 dc.domain.com"); // 或 // $ldapconn = ldap_connect('dc2.domain.com)or die("無法連接至 dc2.domain.com"); //以下兩行務必加上,否則 Windows AD 無法在不指定 OU 下,作搜尋的動作 ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); if ($ldapconn) { // binding to ldap server echo("連結$domain ".$ldaprdn.",".$ldappass." "); $ldapbind = ldap_bind($ldapconn, $user, $password); //$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); //$ldapbind = ldap_bind($ldapconn); // verify binding if ($ldapbind) { $filter = "(sAMAccountName=$user)"; $result = @ldap_search($ldapconn, $dn, $filter); if($result==false) echo "認證失敗(找不到 $user)"; else { echo "認證成功..."; //取出帳號的所有資訊 $entries = ldap_get_entries($ldapconn, $result); $data = ldap_get_entries( $ldapconn, $result ); echo $data ["count"] . " entries returned\n"; for($i = 0; $i <= $data ["count"]; $i ++) { for($j = 0; $j <= $data [$i] ["count"]; $j ++) { echo "[$i:$j]=".$data [$i] [$j] . ": " . $data [$i] [$data [$i] [$j]] [0] . "\n "; } } } } else { echo "認證失敗..."; } } //關閉LDAP連結 ldap_close($ldapconn);
進階閱讀:
沒有留言:
張貼留言