iT邦幫忙

0

php要如何與ldap做密碼驗證呢?

公司要架設一個內部系統,希望透過lpad的方式來驗證用戶當做登入的資訊
目前小弟已經抓出這些資料

已經可以定義帳號為英文名字或是email了,
但抓不到密碼資訊,實在不知道密碼要怎麼做驗證…

這是小弟目前已經抓到的欄位資料

小弟知道密碼已經是經過加密的了,但重點不是有沒有加密,而是抓不到密碼,實在不知道怎麼驗證呀…

苦腦中…求前輩指導…

James iT邦大師 7 級 ‧ 2015-03-06 13:12:44 檢舉
http://weblite.ca/svn/dataface/modules/Auth/ldap/trunk/ldap.php
這邊這個例子是LDAP SERVER提供匿名查詢,所以它不用先BIND就先做查詢,查到結果再用BIND的方法驗證帳號密碼。
如果你的LDAP不支援匿名查詢,就要先用已知的帳號密碼先BIND,後面再做查詢就一樣了。
8
wiseguy
iT邦超人 1 級 ‧ 2015-03-05 17:02:13
最佳解答

ldap_bind() 能夠執行成功,就代表帳號密碼無誤了,為什麼還要抓密碼?
ldap 也不會允許讓你抓出密碼欄。密碼欄你只能寫入,不能讀出。

看更多先前的回應...收起先前的回應...
wiseguy iT邦超人 1 級 ‧ 2015-03-05 17:16:11 檢舉

ghyzsing提到:
帳號為「admin」,密碼為「test」

若該帳號是管理者權限,那麼就可以讀寫所有人的資料。可是登入驗證不需要這麼做。只要把該 user 填的帳密,用 ldap_bind() 去登入,就能知道該帳密 OK 不 OK 了。

ghyzsing iT邦新手 5 級 ‧ 2015-03-05 17:21:56 檢舉


但小弟在ldap_bind認證過了之後
後續的抓資料是@ldap_search($ldapconn, "dc=wonder,dc=game,dc=tw", $filter);
這裡並沒有指定帳號為誰呀…
前輩是否有line或是其它通訊方式,在私下指導小弟呢?

ghyzsing iT邦新手 5 級 ‧ 2015-03-05 17:26:18 檢舉

小弟請網管另開一個獨立帳號出來,突然覺得好像發現盲點了

ghyzsing iT邦新手 5 級 ‧ 2015-03-05 17:28:31 檢舉

oh..網管剛才了一個個人帳號「test」出來,用這個「test」就登入失敗…

James iT邦大師 7 級 ‧ 2015-03-06 08:06:10 檢舉

要撈出多少資料要看 ldap_search傳入的參數決定,如果沒有特別權限限制一般user也可以找到全部資料。
ldap_bind的時候要用完整UID,有時候登入的帳號會存在於不同的OU,造成有的帳號可以登入有的帳號不能登入的情形,所以要分兩階段去做,先用登入帳號做ldap_search,找到後確認這個帳號uid,再用這個帳號的uid和密碼做ldap_bind測試認證。

ghyzsing iT邦新手 5 級 ‧ 2015-03-06 10:00:52 檢舉

剛剛去問網管時,網管說沒有uid這個欄位可以設定
但小弟撈出來有uid字眼的是這個,不知前輩指的uid是否為圖裡的亂碼呢?

另外小弟已經可以撈出固定帳戶的資料,

但為什麼只輸入samaccountname就可以出現呢?
不是應該還需要一道密碼呢?
另外小弟不解的是…密碼不知該設定在哪個參數帶進去

ghyzsing iT邦新手 5 級 ‧ 2015-03-06 10:01:31 檢舉

補充上個回應的程式碼

2
外獅佬
iT邦大師 1 級 ‧ 2015-03-05 16:54:28

你在Ldap_bind的時候,不是就把$password丟進去當參數了嗎??疑惑

6
raytracy
iT邦大神 1 級 ‧ 2015-03-05 23:24:38

這裡有一個可以馬上測試的範例:
How to use LDAP Active Directory Authentication with PHP
他的基本原理是: 用你要驗證的那個 username 和 password 去做 ldap_bind, 如果可以 bind 成功, 代表密碼正確; 如果 bind 失敗, 密碼就是錯的.

你不需要自己去比對 LDAP 裡面所存的密碼雜湊是否正確? 這個工作只要透過 ldap_bind 程式庫來幫你做就好了, 這樣可以連密碼雜湊都不會洩漏給程式知道. 所以使用 ldap_bind 的時候, 並不是把 admin 的密碼船進去, 而是要傳被驗證人的帳密.

我要發表回答

立即登入回答