2009-04-20 33 views
10

我想在任何目錄服務的Windows操作系統上驗證我的應用程序的用戶名和密碼。例如,它可能是Microsoft Active Directory,Novell eDirecotry或SunOne。我已經知道如何使用c#爲Microsoft Active Direcotry本地執行此代碼。 (我完全放棄使用ADSI並創建一個低級com組件)如何在.NET中驗證LDAP

我試圖用Novel eDirecotory進行身份驗證的方式是我安裝了Mono項目。在他們爲您提供Novell.Directory.ldap.dll的單聲道項目中,代碼看起來與Microsoft Active Directory相同(http://www.novell.com/coolsolutions/feature/11204.html

對於SunOne,我被告知使用與活動目錄相同的代碼, 。但LDAP connecton字符串是有點不同(http://forums.asp.net/t/354314.aspx) (http://technet.microsoft.com/en-us/library/cc720649.aspx

到我的項目複雜的是,大多數客戶使用「服務帳戶:」這意味着我需要之前,我可以使用管理用戶名和密碼綁定驗證常規用戶名和密碼。我的問題分爲兩部分。

1)從上面我已經解釋過的,這是我應該對每個單獨的定向服務進行認證的正確方向嗎?

2)我覺得我根本不需要做任何這些代碼。我也覺得使用服務帳戶的規定並不重要。如果我所關心的是在Windows機器上驗證用戶名和密碼,爲什麼我甚至需要使用ldap?我想說的是,考慮一下。當您早晨登錄到您的計算機時,您不必提供僅用於登錄的服務帳戶。我可以通過使用runas功能輕鬆地在DOS提示符下驗證用戶名和密碼,並且我將被拒絕或不能解析文本文件。我確定還有其他方法可以將用戶名和密碼傳遞給我所在的Windows操作系統,並告訴我用戶名和密碼是否對它所在的域有效。我對嗎?如果是的話,你們有什麼建議的方式?

邁克爾Evanchik www.MikeEvanchik.com

回答

3

所有這些都可以通過System.DirectoryServices.Protocols完成。如果您創建一個LdapConnection到目錄,您可以使用該服務帳戶綁定,然後進行後續綁定來驗證憑據。

服務帳戶通常用於限制對服務器的身份驗證機制的訪問。這樣,街上的任何人都不會嘗試使用LDAP服務器進行身份驗證。

另外,您是否期望每個用戶在登錄時都會提供其可分辨名稱?通過Active Directory,只需要sAMAccountName,但其他提供程序(如eDirectory和SunONE)則需要使用專有名稱進行身份驗證。

要執行此類型的身份驗證,您需要使用提供的服務帳戶向服務器進行身份驗證,使用給定的用戶名搜索用戶,並獲取該用戶的專有名稱。然後您可以使用提供的專有名稱和密碼進行身份驗證。

這將適用於所有的LDAP系統,Active Directory只有sAMAccountName纔會滿意。

11

我不知道我完全理解這個問題,但我發現有些情況下,很容易被簡單地做他們的帳戶搜索的用戶進行身份驗證和使用他們的憑據作爲用戶名和密碼。

成功的查詢意味着提供的一切都是正確的,沒有找到該帳戶意味着有什麼錯誤。

//use the users credentials for the query 
DirectoryEntry root = new DirectoryEntry(
    "LDAP://dc=domain,dc=com", 
    loginUser, 
    loginPassword 
    ); 

//query for the username provided 
DirectorySearcher searcher = new DirectorySearcher(
    root, 
    "(sAMAccountName=" + loginUser + ")" 
    );  

//a success means the password was right 
bool success = false; 
try { 
    searcher.FindOne(); 
    success = true; 
} 
catch { 
    success = false; 
} 

也許不是「最佳做法」,但可能會避開你有你的問題......

+0

我假設上面只是微軟的AD,而且正在使用LDAP。感謝代碼。我的問題更多的是普遍的方式,可能不使用LDAP,因爲一些LDAP服務器需要一個服務帳戶用戶名和密碼,只是爲了綁定,所以你甚至可以嘗試認證一個普通用戶。 – 2009-04-21 14:47:45

+0

這就是我的建議 - 使用登錄用戶的憑據(假設你要求他們的用戶名和密碼)作爲服務帳戶。應該至少能夠查詢並查看他們自己的帳戶。如果那有效,那麼你知道驗證工作。這似乎是一個相當普遍的方式來檢查密碼是否正確。 – Hugoware 2009-04-21 16:07:59

0

我們有一個網站,需要進行身份驗證對域憑據用戶名和密碼,並使用LogonUser的API功能。將它用於網絡登錄(它的一個參數是登錄類型),它所做的所有工作都是驗證憑據,它不會執行加載用戶配置文件那樣的事情。 唯一需要注意的是該服務帳戶確實需要足夠的訪問權才能調用LogonUser。我建議你檢查一下MSDN文檔的內容,因爲它因操作系統而異。