2012-04-09 169 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 

我希望这有点帮助解决问题...

相关问题