ldap登錄驗證的通用步驟


和利用數據庫進行驗證類似,LDAP中也是利用登陸名和密碼進行驗證,LDAP中會定義一個屬性password,用來存放用戶密碼,而登陸名使用較多的都是mail地址。那怎么樣才能正確的用LDAP進行身份驗證呢,下面是一個正確而又通用的步驟:
       1. 從客戶端得到登陸名和密碼。注意這里的登陸名和密碼一開始並沒有被用到。

       2. 先匿名綁定到LDAP服務器,如果LDAP服務器沒有啟用匿名綁定,一般會提供一個默認的用戶,用這個用戶進行綁定即可。

       3. 之前輸入的登陸名在這里就有用了,當上一步綁定成功以后,需要執行一個搜索,而filter就是用登陸名來構造,形如: "(|(uid=$login)(mail=$login))" ,這里的login就是登陸名。搜索執行完畢后,需要對結果進行判斷,如果只返回一個entry,這個就是包含了該用戶信息的entry,可以得到該entry的DN,后面使用。如果返回不止一個或者沒有返回,說明用戶名輸入有誤,應該退出驗證並返回錯誤信息。

       4. 如果能進行到這一步,說明用相應的用戶,而上一步執行時得到了用戶信息所在的entry的DN,這里就需要用這個DN和第一步中得到的password重新綁定LDAP服務器。

       5. 執行完上一步,驗證的主要過程就結束了,如果能成功綁定,那么就說明驗證成功,如果不行,則應該返回密碼錯誤的信息。

       這5大步就是基於LDAP的一個 “兩次綁定” 驗證方法,下面這個圖能更形象的說明這個過程:

 

        為什么基於LDAP進行驗證需要“兩次”綁定呢,為什么不能取出password然后和輸入進行比較呢,試想一下,如果需要讀出密碼,服務器上的密碼存儲要么就不加密,直接可以讀出,要么客戶就需要知道服務器使用的加密方式,這是不安全,也是不好的,服務器不希望加密方式讓客戶端知道,客戶端也不需要知道這么多。而從實際來看,LDAP服務器對於password屬性默認都是不可讀的,甚至有的服務器根本就不支持password屬性可讀,遇到這種情況,也就沒有辦法取得密碼了。

       還有一個問題就是,為什么我們需要第一次綁定?為什么不直接使用DN呢,首先就是關於這個DN,對於一般的客戶端程序,其並不知道具體的DN是什么。再者讓用戶輸入DN,給用戶帶來不便的同時,驗證也帶來問題,因為如果輸入的是個目錄樹而不是所期望的DN,在進行綁定時有可能會讓服務器產生不可預料的錯誤。

       從上面看來,基於LDAP進行身份驗證,最好也是最通用的方法就是 “兩次綁定”。

 

所謂的bind是一個authentication的過程,不要把它想像成“綁定”,既然是認證,就需要一個用戶名和密碼,openldap中如果出示的用戶名和密碼錯誤,服務器會嘗試匿名認證,就和匿名ftp一樣。當然,在現實配置中可能需要在認證不獲得成功就不能做查詢操作,這些是在slapd.conf文件中通過設置ACL實現的。

 

認證所用的用戶名和密碼為目錄樹中某個節點的兩個屬性(用戶名和密碼),一般情況下,程序會默認使用uid和userPassword屬性。寫程序進行認證的時候只要提供這個節點的兩個屬性就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM