我在将ASP.NET Web服务与Active Directory设置集成时遇到问题,并使用它来验证用户并检查他们是AD组的成员,以及他们是否有权使用我的自定义应用程序。
我的自定义应用程序有自己的权限,管理员配置允许使用自定义应用程序的Active Directory组。
我遇到的问题是当来自不同Trusted AD林的用户尝试登录时,我无法从AD服务器获取他的组列表,我的ASP.NET Web服务进行通信用。 ASP.NET Web服务只能访问AD服务器(AD Main),而不能访问信任AD控制器(AD Secondary)。
用户是(AD辅助)域的成员,我可以针对(AD Main)域对该用户进行身份验证,但是当用户无法从(AD Main)域获取组列表时在(AD辅助)域中。
我试过这段代码。
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 :(得分:1)
这似乎是AD派生属性memberOf的一个很好的用例。使用DirectoryEntry directoryEntry
对象,您可以枚举用户所属的组。
foreach (object group in directoryEntry.Properties["memberOf"])
{
DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group);
groupids.Add(obGpEntry.NativeGuid);
}
如果你用“LDAP://”作为前缀,你也可以使用第一个代码段
答案 1 :(得分: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
我希望这有助于解决问题...