2015-02-23 44 views
1

我嘗試從我的機​​器驗證屬於遠程ActiveDirectory的用戶,該機器與當前機器或用戶域不同。我的機器和遠程ActiveDirectory機器之間不會有任何信任。驗證C#中遠程Active Directory的用戶

初步嘗試

我試圖驗證用戶(輸入:sAMAccountName賦,機器的ip地址,機器的域用戶名(「管理員」)和機器的密碼(***)抽到導致用戶與 'sAMAccountName賦' 在ActiveDirectory中確實存在

我的要求

  1. 試想一下,已經是一個用戶( 「QWERTY」)爲Cr eated在ActiveDirectory中

  2. 從我的本地機器上,我會有以下信息,

    一個。遠程ActiveDirectory IP地址

    b。遠程ActiveDirectory機器的用戶名和密碼。

    c。用戶名和密碼用戶的「QWERTY」

  3. 我需要檢查用戶「QWERTY」是否出現在遠程ActiveDirectory中的用戶列表,並驗證輸入的密碼是否是相同的ActiveDirectory中的用戶列表中

代碼我想:

 DirectoryEntry entry = new DirectoryEntry("LDAP://ipaddress/DC=dinesh,DC=com", name, password); 
     DirectorySearcher searcher = new DirectorySearcher(entry); 
     searcher.Filter = "(sAMAccountName=" + name + ")"; 

     try 
     { 
      SearchResult adsSearchResult = adsSearcher.FindOne(); 
      isValid = true; 
      adsEntry.Close(); 
     } 
     catch (Exception ex) 
     { 
      adsEntry.Close(); 
     } 

我需要創造之間的信任本地計算機和遠程ActiveDirectory計算機在驗證遠程ActiveDirectory中的用戶之前?如果是,請告訴我們如何完成;

創建信任後,如何驗證用戶?

============================================== =============================

我能夠使用Rainer建議的解決方案,但有一個新問題。當我通過不同機器上的C#代碼創建新用戶時,有些屬性設置不正確。 Properties not set when creating user

創建用戶時需要強制設置嗎?

+1

當您編寫「遠程活動目錄」時,我認爲它與當前機器或用戶域不是同一個域。正確嗎?如果兩個域之間沒有信任,則需要對遠程域進行身份驗證(您的實際行爲是什麼)。但是,你認爲「遠程AD中的用戶身份驗證」意味着什麼?請詳細解釋一下,你想驗證什麼?如果用戶真的存在那裏? – 2015-02-23 10:24:44

+0

嗨Rainer,我編輯過,回答你的問題。請看看 – 2015-02-23 11:35:56

+1

嗨Dinesh,好吧,現在這變得更清晰了。我想我理解你的要求。給我一些時間(1-2天)的答案和一些建議(我今天讀你的問題,因爲我幾年前與Active Directory和LDAP有關,我會盡力幫助你) – 2015-02-23 12:23:41

回答

6

首先是一些基礎知識(獨立這個問題)

認證

系統檢查,如果Bob是真的鮑勃。在Active Directory環境中,通常使用來自工作站的域登錄來完成此任務,Bob輸入他的用戶名和密碼,然後獲得Kerberos票證。之後,如果他想訪問例如遠程文件服務器上的文件共享,他不需要再登錄,並且可以在不輸入用戶名/密碼的情況下訪問文件。

授權

系統檢查哪些資源鮑勃被允許訪問。 Bob通常位於域組中,並且一個組位於資源的ACL(訪問控制列表)中。

如果存在多個信任域,Bob需要在一個域中登錄,並且可以訪問所有其他域中的資源。 這是使用Active Directory的主要原因之一:在

檢查,如果用戶/密碼是否有效

如果你有一個用戶名和密碼,並要檢查,如果密碼是有效的單點登錄,您必須做一個登錄到域。沒有辦法只是「檢查密碼是否正確」。 登錄方式:如果存在安全策略「鎖定賬戶超過3次無效登錄」,則即使「只想檢查用戶名+密碼」,該賬戶也會被鎖定檢查錯誤密碼。

使用.NET目錄服務功能

我這裏假設的流程是由人的帳戶作爲一個正常的程序運行,或者該程序是Windows服務或計劃任務了區域下運行「技術用戶」帳戶。在這種情況下,您不需要提供使用AD功能的憑證。如果訪問其他信任的AD域,這也是事實。 如果您想登錄到「外地」,並且沒有信任,則需要提供用戶名和密碼(如您的代碼中所示)。

「手動」 驗證用戶

通常情況下,這不應該是必要的。示例:ASP.NET Intranet使用情況。用戶訪問當前域或信任域上的Web應用程序,身份驗證由瀏覽器和IIS(如果已啓用集成Windows身份驗證)在「後臺」完成。所以你永遠不需要在應用程序中處理用戶密碼。

我沒有看到很多使用情況,其中密碼由代碼處理。

可能你的程序是一個輔助工具,用於存儲緊急用戶帳戶/密碼。你想定期檢查這些帳戶是否有效。

這是一個簡單的方法來檢查:

using System.DirectoryServices.AccountManagement; 
... 

PrincipalContext principalContext = 
    new PrincipalContext(ContextType.Domain, "192.168.1.1"); 

bool userValid = principalContext.ValidateCredentials(name, password); 

你也可以使用舊的,生ADSI功能:

using System.DirectoryServices; 
.... 

bool userOk = false; 
string realName = string.Empty; 

using (DirectoryEntry directoryEntry = 
    new DirectoryEntry"LDAP://192.168.1.1/DC=ad,DC=local", name, password)) 
{ 
    using (DirectorySearcher searcher = new DirectorySearcher(directoryEntry)) 
    { 
     searcher.Filter = "(samaccountname=" + name + ")"; 
     searcher.PropertiesToLoad.Add("displayname"); 

     SearchResult adsSearchResult = searcher.FindOne(); 

     if (adsSearchResult != null) 
     { 
      if (adsSearchResult.Properties["displayname"].Count == 1) 
      { 
       realName = (string)adsSearchResult.Properties["displayname"][0]; 
      } 
      userOk = true; 
     } 
    } 
} 

如果你的實際需求其實是用戶+密碼有效性檢查,你可以用這些方法之一來完成。

但是,如果它是一個「正常應用程序」,它只是想檢查輸入的憑證是否有效,則應重新考慮您的邏輯。在這種情況下,您最好應該依靠AD的單點登錄功能。

如果還有其他問題,請發表評論。

b。遠程ActiveDirectory機器的用戶名和密碼。

這聽起來有點不清楚。我假設你的意思是「遠程域中的用戶名和相應的密碼」。

還有一個機器賬戶的概念,它是用$附加的主機名。但那是另一個話題。


創建新的用戶

選項1

using (DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://192.168.1.1/CN=Users,DC=ad,DC=local", 
     name, password)) 
{ 
    using (DirectoryEntry newUser = directoryEntry.Children.Add("CN=CharlesBarker", "user")) 
    { 
     newUser.Properties["sAMAccountName"].Value = "CharlesBarker"; 
     newUser.Properties["givenName"].Value = "Charles"; 
     newUser.Properties["sn"].Value = "Barker"; 
     newUser.Properties["displayName"].Value = "CharlesBarker"; 
     newUser.Properties["userPrincipalName"].Value = "CharlesBarker"; 
     newUser.CommitChanges(); 
    } 
} 

選項2

using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "192.168.1.1", 
    "CN=Users,DC=ad,DC=local", name, password)) 
{ 
    using (UserPrincipal userPrincipal = new UserPrincipal(principalContext)) 
    { 
     userPrincipal.Name = "CharlesBarker"; 
     userPrincipal.SamAccountName = "CharlesBarker"; 
     userPrincipal.GivenName = "Charles"; 
     userPrincipal.Surname = "Barker"; 
     userPrincipal.DisplayName = "CharlesBarker"; 
     userPrincipal.UserPrincipalName = "CharlesBarker"; 
     userPrincipal.Save(); 
    } 
} 

我留下作爲一個練習,你找出哪些屬性放在哪個用戶對話框項字段:-)

+0

謝謝Rainer,唯一的事情是我能夠只驗證那些直接在Active Directory中創建的用戶。如果我通過遠程本地機器上的C#代碼創建一個新用戶,Property'用戶登錄名(pre_Windows 2000)被設置爲一些隨機字符串,所以我無法驗證通過c#代碼創建的用戶(我附上了有問題的截圖並編輯相同) – 2015-02-24 09:23:56

+1

你是對的,你必須明確地設置一些字段,看看我編輯的答案。 – 2015-02-24 18:46:53

相關問題