2010-06-02 13 views
23

Necesito acceder a Active Directory para obtener información sobre los grupos a los que pertenecen los clientes. El proyecto que tengo es una aplicación ASP.Net MVC que usa C#. Nunca he programado antes en Active Directory y necesito algunos consejos sobre cuál es la mejor manera de comenzar, qué modelo de seguridad usar para acceder a la información, y tal vez apuntarme a algunos buenos tutoriales.Acceso a Active Directory desde ASP.Net MVC utilizando C#

Respuesta

45

Dado que está utilizando MVC, que tienen acceso a la nueva System.DirectoryServices.AccountManagement espacio de nombres en .NET 3.5. Estas clases deben preferirse a las clases más antiguas en DirectoryServices, ya que son mucho más simples de usar. Hay un par de errores que no se han resuelto en 3.5 (límite de 1500 miembros cuando se consultan grupos, por ejemplo), pero estoy seguro de que se han corregido en .NET 4.0. Para la mayoría de las tareas, las nuevas clases funcionan muy bien.

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 
+1

+1 ¡Interesante! Solo tuve la oportunidad de trabajar contra el AD en .NET 2.0. =) –

+0

¡Realmente, realmente sexy! –

+0

Es bueno cuando simplemente funciona – IdahoSixString

12

Use System.DirectoryServices espacio de nombres para acceder al AD.

Las dos clases más importantes son:

  1. DirectoryEntry;
  2. DirectorySearcher.

Supongamos que su dominio es: MyIntranet.MyCompany.com

A continuación, tendrá que crear una instancia de la raíz de la clase DirectoryEntry:

DirectoryEntry root = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com"); 

Al buscar en la AD para una ocurrencia particular de un grupo o usuario:

DirectorySearcher searcher = new DirectorySearcher(); 
searcher.SearchRoot = root; 
searcher.SearchScope = SearchScope.Subtree; 

Digamos que usted quiere buscar un nombre de usuario con nombre: AnyUser1, la DirectorySearcher.Filter debe verse como:

searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})", "AnyUser1"); 

A continuación, obtener el resultado a través de la clase SearchResult de la siguiente manera:

bool userFound = false; 
SearchResult foundUser = null; 

try { 
    foundUser = searcher.FindOne(); // You might as well use the FindAll() method if you expect more then one result. 
    userFound = foundUser != null; 
} catch(Exception) { 
    throw; 
} 

if (!userFound) 
    return; 

DirectoryEntry user = foundUser.GetDirectoryEntry(); 

a continuación, puede obtener los grupos que este usuario es miembro de éstos, como así también por la memberOf propiedad:

user.Properties("memberOf").Value 

Para obtener una buena visión general, consulte este artículo de CodeProject: How to (almost) everything in Active Directory.

Y una lista de las propiedades: Mapping Between IADsUser Properties and Active Directory Attributes.

editar # 1

Si está utilizando suplantación, puede que tal vez considerar el establecimiento de algunos parámetros para su aplicación como DefaultRootDomain, DefaultUserName y DefaultPassword, luego usarlos cuando una instancia de su root DirectoroEntry.

public static class AdHelper { 

    public static string DefaultRootDse { 
     get { 
      return Properties.Settings.Default.DefaultRootDomain; 
     } 
    } 

    private static string DefaultUserName { 
     get { 
      return Properties.Settings.Default.DefaultUserName; 
     } 
    } 

    private static string DefaultPassword { 
     get { 
      return Properties.Settings.Default.DefaultPassword; 
     } 
    } 

    public static DirectoryEntry RootDse { 
     get { 
      if (_rootDse == null) 
       _rootDse = new DirectoryEntry(DefaultRootDse, DefaultUserName, DefaultPassword); 
      return _rootDse; 
     } 
    } 
    private static DirectoryEntry _rootDse; 
} 
+0

¿No necesito a specifiy una cuenta de usuario y la contraseña a utilizar para acceder a los datos? –

+0

Si usa la suplantación, sí. De lo contrario, la clase 'DirectoryEntry' y el AD asume el usuario conectado actualmente (para una sesión de Windows, digamos. No sé cómo usarlo a través de una aplicación web). –

0

Si tiene .NET 3.5 o si puede actualizar a él - por todos los medios utilizar la nueva característica en System.DirectoryServices.AccountManagement!

Consulte un gran artículo introductorio Managing Directory Security Principals in the .NET Framework 3.5 en la Revista MSDN para obtener más información y un jumpstart.

Cuestiones relacionadas