2012-04-09 33 views
6

Tengo un problema con la integración de mi servicio web ASP.NET con una configuración de Active Directory, y utilizándolo para autenticar usuarios y consultar con grupos de AD de los que son miembros y si tienen Permisos para usar mi aplicación personalizada.Obteniendo grupos de usuarios en Active Directory

Mi aplicación personalizada tiene sus propios permisos y los administradores configuran grupos de Active Directory que permiten el uso de la aplicación personalizada.

El problema que tengo es cuando un usuario de un bosque diferente de Trusted Trusted, con plena confianza bidireccional, intenta iniciar sesión. No puedo obtener una lista de sus grupos del servidor AD mis servicios web ASP.NET se comunica con. El servicio web ASP.NET solo tiene acceso al servidor AD (AD Main), no al controlador AD de confianza (Secundario AD).

El usuario es un miembro del dominio (AD Secundario), y puedo autenticar a ese usuario contra el dominio (AD Principal), pero no puedo obtener una lista de grupos del dominio (AD Principal) cuando el el usuario está en el dominio (AD Secundario).

He intentado este código.

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; } 

He intentado alejarme del objeto DirectoryEntry, algo como esto.

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); 
     } 
    } 

} 

embargo, no consigo el usuario y no puedo obtener una lista de los grupos de ese usuario en el otro dominio. Cualquier ayuda sería apreciada.

+0

He [previamente tenía] (http://serverfault.com/questions/358102/inconsistent-information-in-active -directory-members-and-member-of-properties) un pequeño mundo de dolor con la membresía del grupo AD. Buena suerte, es todo lo que puedo decir ... – AakashM

+0

aún no hemos encontrado una solución, pero parece que vamos a instalar ADFS –

Respuesta

1

Esto parece ser un gran caso de uso para el atributo derivado del AD memberOf. Con el objeto DirectoryEntry directoryEntry, puede enumerar a qué grupo pertenece un usuario.

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

Es también probable que usted podría utilizar el primer segmento de código si el prefijo ob con "LDAP: //"

+0

intentado esto, no hay dados :( –

+0

Oh, has intentado hacerse pasar por un usuario que tiene leer los derechos en el dominio primario y secundario de todos los objetos que está consultando? Esto suena como un problema de derechos de AD – Kodra

+0

yah, que tampoco funcionó :( –

0

Yo creo que hay que conectar con la AD a distancia y obtener los datos que desea.

me escribió una réplica de una vez, donde i replicar desde muchos AD

algún código por fuera de él:

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 

Sé que esto no es exactamente lo que necesita, pero esto muestra cómo conectar y obtener datos de cualquier AD. En mi caso, obtengo una lista de usuarios, una lista de grupos o lo que sea y luego trabajo con esas colecciones.

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 

Espero que esto ayude un poco para resolver el problema ...

Cuestiones relacionadas