2010-10-14 69 views
0

我需要驗證密碼對用戶是否正確。驗證密碼是否正確

我有這樣的代碼:

private bool checkOldPasswordValid(string password, string username) 
    { 
     using (DirectoryEntry entry = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer")) 
     { 
      entry.Username = username; 
      entry.Password = password; 

      DirectorySearcher searcher = new DirectorySearcher(entry); 

      searcher.Filter = "(objectclass=user)"; 
      try 
      { 
       searcher.FindOne(); 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
      return true; 
     } 
    } 

但隨後的目錄搜索不與WINNT支持,讓我經歷了所有的記錄中發現另一種方式來循環。

foreach (DirectoryEntry dc in entry.Children) 
      { 
       // prints the name 
       System.Diagnostics.Debug.WriteLine(dc.Name); 
      } 

但這只是得到的名稱,並沒有驗證密碼。

請大家幫忙。謝謝

回答

3

要驗證LDAP或WinNT,您不需要DirectorySearcher。您只需從DirectoryEntry實例中獲取NativeObject即可。這裏有一個代碼示例,可能會指導您完成。

public bool Authenticate(string username, string password, string domain) { 
    bool authenticated = false; 

    using (DirectoryEntry entry = new DirectoryEntry(@"WinNT://" + domain, username, password) { 
     try { 
      object nativeObject = entry.NativeObject; 
      authenticated = true; 
     } catch (DirectoryServicesCOMException ex) { 
     } 
    } 

    return authenticated; 
} 

此代碼將返回一個用戶是否真實。一旦你可以使用這個DirectoryEntry類實例獲取NativeObject屬性,這意味着AD(或本地計算機)使用模擬來獲取此對象。如果您在沒有拋出異常的情況下獲取對象,這意味着AD(或本地計算機)能夠對模擬用戶進行身份驗證。

儘管您可以通過指定沒有用戶名和密碼,但僅指定域(或本地計算機),通過指定用戶名和密碼來使用當前已通過身份驗證的用戶,但是您要求使用身份驗證,因此安全基礎結構將使用嘗試從此DirectoryEntry類實例中檢索NativeObject屬性的給定用戶名和密碼。

要對AD進行身份驗證,請將"WinNT://"替換爲"LDAP://"

+0

如果域名有時是空白的話會怎麼樣?會是一個問題嗎? – user175084 2010-10-14 15:52:02

+1

域可以是本地計算機名稱,也可以是使用AD的域控制器中的域。通常情況下,域不應該是空白的。我從來沒有測試過一個空白域,但我想這會導致'try ... catch'扔。也許最好是單元測試,然後嘗試每個參數的每個可能的值。 – 2010-10-14 15:55:52

+0

DirectoryEntry entry = new DirectoryEntry(「WinNT://」+ Environment.MachineName,Session [「userName」]。ToString(),password); – user175084 2010-10-14 16:18:33

2

您可以使用DirectoryEntry本身。

在這裏看到的例子:你爲什麼要使用WINNT http://support.microsoft.com/kb/316748

://反正?

+0

假設本地帳戶不是活動目錄的一部分,..那就是爲什麼。 。但我不知道..請讓我知道,如果你有更多的信息在此..謝謝 – user175084 2010-10-14 15:43:23

+0

他使用WinNT://對計算機本身進行身份驗證,而不是AD。 – 2010-10-14 15:43:55

+1

@ user175084:使用AD時,您不應管理本地帳戶。讓我解釋。假設用戶在本地計算機上認證自己,然後希望訪問網絡資源。即使您通過本地計算機對該用戶進行了身份驗證,但如果用戶不知道AD,AD也不會讓該用戶獲得他所需的任何資源。如果您希望管理本地計算機用戶帳戶,則情況會有所不同。 – 2010-10-14 15:47:03