24 votos

El acceso a Active Directory de ASP.Net MVC usando C#

Necesito tener acceso a Active Directory para obtener información acerca de los grupos que los clientes que pertenecen. El proyecto que tengo es una ASP.Net aplicación MVC usando C#. Nunca he programado en contra de Active Directory antes, y la necesidad de algunos consejos sobre cuál es la mejor manera de empezar es, ¿qué modelo de seguridad a utilizar para acceder a la información, y tal vez me apunte a algunos buenos tutoriales.

46voto

tvanfosson Puntos 268301

Ya que usted está utilizando MVC, usted tiene acceso al nuevo Sistema.DirectoryServices.AccountManagement espacio de nombres .NET 3.5. Estas clases deben ser preferibles a las antiguas clases en DirectoryServices sí mismo ya que son mucho más fáciles de usar. Hay un par de errores que no han sido resueltos en 3.5 (1500 miembro límite cuando se consulta a los grupos, por ejemplo), pero estoy seguro de que estos han sido corregidos .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();
          ...
      }
 }

12voto

Will Marcouiller Puntos 11649

Uso System.DirectoryServices de espacio de nombres para acceder a la AD.

Las dos clases más importantes son:

  1. DirectoryEntry;
  2. DirectorySearcher.

Supongamos que su dominio es: MyIntranet.MyCompany.com

Entonces, usted tendrá que crear una raíz instancia de la DirectoryEntry clase:

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

Cuando se busca el ANUNCIO de un particular ocurrencia de un usuario o grupo:

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

Digamos que usted quiere buscar un nombre de usuario nombre: AnyUser1, el DirectorySearcher.El filtro debe verse así:

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

A continuación, obtener el resultado a través de la SearchResult clase 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, puedes obtener los grupos que este usuario es miembro de igual manera a través de la memberOf de la propiedad:

user.Properties("memberOf").Value

Para una buena visión general, consulte este CodeProject artículo: Cómo (casi) todo lo que en Active Directory.

Y ofr una lista de las propiedades: Mapeo Entre IADsUser Propiedades y Atributos de Active Directory.

EDICIÓN #1

Si usted está utilizando la suplantación, tal vez considere la posibilidad de establecer algunos parámetros para su aplicación, tales como DefaultRootDomain, DefaultUserName y DefaultPassword, para luego utilizarlos al crear instancias de su raíz 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;
}

0voto

marc_s Puntos 321990

Si usted tiene .NET 3.5 o si se puede actualizar a él por todos los medios el uso de la nueva característica en System.DirectoryServices.AccountManagement!

Ver una gran introducción el artículo la Gestión de Directorio de entidades de Seguridad en el .NET Framework 3.5 en MSDN Magazine para obtener más información y una jumpstart.

0voto

por qué no del Sistema.Web.La seguridad? Fue allí también en framework 2.0

es decir: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs. 85) y ahora en el framework 4.0: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs. 100)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X