2012-04-09 167 views
6

我在將ASP.NET Web服務與Active Directory設置集成並將其用於身份驗證用戶並與AD組成員身份一起檢查時遇到問題,並且他們是否有有權使用我的自定義應用程序。獲取Active Directory中的用戶組

我的自定義應用程序有自己的權限,管理員配置允許使用自定義應用程序的Active Directory組。

我遇到的問題是,當來自不同可信AD林的用戶使用完全雙向信任嘗試登錄時,我無法從AD服務器獲取他的組的列表我的ASP.NET Web服務與...交流。 ASP.NET Web服務只能訪問AD服務器(AD Main),而不是AD控制器(AD Secondary)。

用戶是(AD Secondary)域的成員,並且我可以根據(AD Main)域對該用戶進行身份驗證,但我無法從(AD主域)域獲取組列表用戶位於(AD Secondary)域中。

我試過這段代碼。

StringCollection groupids = new StringCollection(); 
try 
{ 
    DirectoryLibrary dirLib = new DirectoryLibrary(); 
    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password); 
    if (directoryEntry != null) 
    { 
     //Enum the properties so we can see what is in them 
     foreach (string propname in directoryEntry.Properties.PropertyNames) 
     { 
      Debug.WriteLine(propname); 
     } 

     object obGroups = directoryEntry.Invoke("Groups"); 
     foreach (object ob in (IEnumerable)obGroups) 
     { 
     // Create object for each group. 
      DirectoryEntry obGpEntry = new DirectoryEntry(ob); 
      groupids.Add(obGpEntry.NativeGuid); 
     } 
    } 
} 
catch (DirectoryServicesCOMException ex) { throw ex; } 

我試過從DirectoryEntry對象移開,就像這樣。

List<GroupPrincipal> result = new List<GroupPrincipal>(); 
StringCollection groupids = new StringCollection(); 

PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password); 

// find your user 
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    PrincipalSearchResult<Principal> groups = user.GetGroups(); 

    // iterate over all groups 
    foreach (Principal p in groups) 
    { 
     // make sure to add only group principals 
     if (p is GroupPrincipal) 
     { 
      groupids.Add(p.DisplayName); 
     } 
    } 

} 

但是,我沒有得到用戶,我無法獲得該用戶在其他域中的組列表。任何幫助,將不勝感激。

+0

我[以前有(http://serverfault.com/questions/358102/inconsistent-information-in-active -directory-members-and-member-properties)與AD組成員關係的一個小世界。祝你好運,我只能說... – AakashM 2012-04-10 15:32:54

+0

我們還沒有找到解決方案,但它看起來像我們要安裝ADFS – 2012-04-16 20:55:30

回答

1

這似乎是AD派生屬性memberOf的一個很好的用例。使用DirectoryEntry directoryEntry對象,可以枚舉用戶所屬的組。

foreach (object group in directoryEntry.Properties["memberOf"]) 
{ 
    DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group); 
    groupids.Add(obGpEntry.NativeGuid); 
} 

它也可能是您可以使用第一代碼段,如果你前綴OB與「LDAP://」

+0

試過這個,沒有骰子:( – 2012-04-10 15:52:18

+0

哦,你有沒有嘗試模擬一個用戶誰擁有讀主權和輔助域的權利,你正在查詢的所有對象?這聽起來像是一個AD權利問題 – Kodra 2012-04-10 16:59:30

+0

呀,這也沒有工作:( – 2012-04-16 20:56:20

0

我認爲你必須連接到遠程AD和得到你想要的數據。

我寫了一個複製一次,在那裏我從很多AD的

一些代碼複製出來的:

Public Function GetDirectoryEntry() As Object 

    If InStr(1, m_sLdapPath, "DC=") > 0 Then 
     Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath) 
     Return directory_service 
    Else 
     Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath) 
     Return directory_service 
    End If 

    End Function 

    Public Function GetUserList() As PrincipalSearchResult(Of Principal) 

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) 
    Dim directory_user As New UserPrincipal(directory_service) 

    Dim directory_userlist As New PrincipalSearcher(directory_user) 
    directory_userlist.QueryFilter = directory_user 
    Return directory_userlist.FindAll 

    End Function 

    Public Function GetGroupList() As PrincipalSearchResult(Of Principal) 

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) 
    Dim directory_group As New GroupPrincipal(directory_service) 

    Dim directory_grouplist As New PrincipalSearcher(directory_group) 
    directory_grouplist.QueryFilter = directory_group 
    Return directory_grouplist.FindAll 

    End Function 

我知道這是不是正是你需要的,但是這顯示瞭如何連接和從任何AD獲取數據。 在我的情況下,我得到一個用戶列表,組列表或任何,然後與這些集合。

Dim l_oGroupList As Object = oDirectory.GetGroupList() 
For Each l_oGroup In l_oGroupList 
    If l_oGroup.Members.Count > 0 Then 
    If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then 
    ' he is part of the group 
    End If 
    End If 
Next 

我希望這有點幫助解決問題...

相關問題