2011-05-25 235 views
0

我對其他人如何編碼感興趣,因爲我要麼沒有正確理解它,要麼我錯過了某些東西,或者甚至我做得很對!通過LDAP進行身份驗證

首先,這不是LDAP的Active Directory實例,它的OpenDS除了某些語法上的差異應該沒什麼關係。

所以假設我有我的樹結構的設置是這樣的:

-dc=somedomain,dc=com 
-uid=rootuser 
    -ou=Group1 
     -uid=username1 
     -uid=username2 
    -ou=Group2 
     -uid=username3 
     -uid=username4 

爲了作爲「rootuser」我需要我的時候我創建到System.DirectoryServices.DirectoryEntry通過完全合格的用戶名進行身份驗證對象,在這種情況下:

UID = rootuser,DC = somedomain,DC = com的

,但在樹中的任何其它用戶我必須提前知道LDAP路徑追加到用戶名,讓他們通過驗證。因此,例如,這將失敗:

UID = USERNAME1,DC = somedomain,DC = com的

,但是這將工作:

UID = USERNAME1,DC = somedomain,DC = COM,OU =組別1

所以我的問題是,當你不知道在登錄時用戶屬於哪個特定組來構建該路徑時,你如何處理這個問題?我唯一可以做到的方法是將初始調用設爲'rootuser',這樣我就可以訪問整個樹,然後使用System.DirectoryServices.DirectorySearcher爲特定用戶掃描它(即用戶名1)

using (DirectorySearcher searcher = GetDirectorySearcher()) { 
    searcher.Filter = "(&(objectClass=person)(uid=" + userName+ "))"; 
    SearchResult result = searcher.FindOne(); 
    return result.GetDirectoryEntry().Path; 
} 

在那一點上,我有我想要登錄的用戶的路徑,我可以繼續進行實際的身份驗證。我在這裏的基地,或者這通常是如何完成的?

謝謝!

回答

0

您可以針對用戶特有的屬性構建搜索過濾器,例如,屏幕名稱,電子郵件。確保配置LDAP以確保它們是唯一的。然後找到相應的條目(如果有的話),獲取DN,並重新鍵入該用戶的密碼。如果沒有這樣的條目,你會做出相應的反應。

你不會說你正在使用什麼語言,但是在JNDI中,這意味着將DN設置爲安全主體,將密碼設置爲憑據並調用LdapContext.reconnect()。

+0

System.DirectoryServices是.NET框架的一部分,對不起,如果不清楚。所以這聽起來像是我根據你所說的正確地做了。是的,uid是這個對象的唯一標識符,謝謝 – snappymcsnap 2011-05-26 01:15:25

0

SASL支持使用用戶名進行身份驗證的概念。您的目錄服務器管理員可能能夠配置目錄服務器以將可分辨名稱映射到身份。鑑於正確的映射,客戶端可以在不知道可分辨名稱的情況下進行身份驗證。專業品質的目錄服務器支持多種不同的映射機制,例如direct mapping,exact match,regular expression或自定義標識映射器。