隨著ldap的發展和趨於成熟,基於ldap的應用也越來越廣泛,這些應用往往都離不開身份驗證。這裡就來說一下基於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的 「兩次繫結」 驗證流程
為什麼基於ldap進行驗證需要「兩次」繫結呢,為什麼不能取出password然後和輸入進行比較呢,試想一下,如果需要讀出密碼,伺服器上的密碼儲存 要麼就不加密,直接可以讀出,要麼客戶就需要知道伺服器使用的加密方式,這是不安全,也是不好的,伺服器不希望加密方式讓客戶端知道,客戶端也不需要知道 這麼多。而從實際來看,ldap伺服器對於password屬性預設都是不可讀的,甚至有的伺服器根本就不支援password屬性可讀,遇到這種情況, 也就沒有辦法取得密碼了。
還有乙個問題就是,為什麼我們需要第一次繫結?為什麼不直接使用dn呢,首先就是關於這個dn,對於一般的客戶端程式,其並不知道具體的dn是什麼。再者 讓使用者輸入dn,給使用者帶來不便的同時,驗證也帶來問題,因為如果輸入的是個目錄樹而不是所期望的dn,在進行繫結時有可能會讓伺服器產生不可預料的錯 誤。
從上面看來,基於ldap進行身份驗證,最好也是最通用的方法就是 「兩次繫結」。
基於LDAP進行驗證 方法和問題
隨著ldap的發展和趨於成熟,基於ldap的應用也越來越廣泛,這些應用往往都離不開身份驗證。這裡就來說一下基於ldap的目錄服務進行驗證。和利用資料庫進行驗證類似,ldap中也是利用登陸名和密碼進行驗證,ldap中會定義乙個屬性password,用來存放使用者密碼,而登陸名使用較多的都是mail位址...
Python 用 LDAP 驗證使用者名稱和密碼
需要安裝 python ldap 網上搜到的方式大多太複雜。以下是一種比較簡單的方式。但還是比用 c 複雜 一點 需要指定使用者名稱所在域。c 用 ldap 驗證使用者名稱和密碼 import ldap ldapserver ldap localhost domain d1 username nam...
使用擴充套件方法對呼叫進行驗證
利用c 3.0提供的擴充套件方法技術,可以為已經編譯好的程式集型別增加新的方法,從而應對新的擴充套件。除了在可擴充套件性方面所具有的優勢之外,如果能夠合理地結合泛型與型別推斷,擴充套件方法還可以有效降低 的重複,提高程式的可重用性。例如,這樣的方法實現 public class customerda...