首先是一些基礎知識(獨立這個問題)
認證
系統檢查,如果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();
}
}
我留下作爲一個練習,你找出哪些屬性放在哪個用戶對話框項字段:-)
當您編寫「遠程活動目錄」時,我認爲它與當前機器或用戶域不是同一個域。正確嗎?如果兩個域之間沒有信任,則需要對遠程域進行身份驗證(您的實際行爲是什麼)。但是,你認爲「遠程AD中的用戶身份驗證」意味着什麼?請詳細解釋一下,你想驗證什麼?如果用戶真的存在那裏? – 2015-02-23 10:24:44
嗨Rainer,我編輯過,回答你的問題。請看看 – 2015-02-23 11:35:56
嗨Dinesh,好吧,現在這變得更清晰了。我想我理解你的要求。給我一些時間(1-2天)的答案和一些建議(我今天讀你的問題,因爲我幾年前與Active Directory和LDAP有關,我會盡力幫助你) – 2015-02-23 12:23:41