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
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();
...
}
}
Use System.DirectoryServices
espacio de nombres para acceder al AD.
Las dos clases más importantes son:
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;
}
¿No necesito a specifiy una cuenta de usuario y la contraseña a utilizar para acceder a los datos? –
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). –
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.
¿por qué no System.Web.Security? Fue también en el marco 2.0
es decir: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.85) y ahora en el marco 4.0: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.100)
- 1. Spring Security 3.1 utilizando Active Directory
- 2. C# Crear unidad organizativa en Active Directory
- 3. Cómo obtener acceso actual desde Active Directory usando el código C#
- 4. Conexión de flex/php a Active Directory
- 5. C# Active Directory Contexto/UserPrincipal.IsMemberOf error
- 6. Autenticación de Active Directory
- 7. Gerrit y Active Directory
- 8. Public Active directory for testing
- 9. Windows Active Directory Emulator
- 10. Active Directory vs OpenLDAP
- 11. Ruta de LDAP Active Directory
- 12. Grupos anidados de Active Directory
- 13. Compruebe que existe un ID de usuario en Active Directory utilizando C#
- 14. Obteniendo grupos de usuarios en Active Directory
- 15. Acceso al repositorio SVN desde CCNet (CruiseControl.net) usando un usuario de Active Directory
- 16. ldap nodejs active directory authentication
- 17. ASP.NET Cómo obtener la lista de grupos en Active Directory
- 18. JNDI con Active Directory PartialResultException
- 19. ¿Cuál es la forma más segura de conectarse a Active Directory desde una DMZ?
- 20. Active Directory Lista de OU
- 21. Rails 3 & devise_ldap_authenticatable: ¿Autorización contra Active Directory?
- 22. ¿Puedo obtener atributos de Active Directory desde el WindowsPrincipal?
- 23. Ver si el usuario es parte del grupo de Active Directory en C# + Asp.net
- 24. Acceso a la base de datos en diferentes servidores de Active Directory
- 25. Active Directory: Recuperar información del usuario
- 26. javascript active directory usuario/grupos consulta
- 27. lograr que los grupos de Active Directory mediante C#
- 28. C# Active Directory: ¿Obtener el nombre de dominio del usuario?
- 29. Obtener la unidad organizativa principal del usuario en Active Directory utilizando C#
- 30. Almacenar datos de aplicaciones en Active Directory
+1 ¡Interesante! Solo tuve la oportunidad de trabajar contra el AD en .NET 2.0. =) –
¡Realmente, realmente sexy! –
Es bueno cuando simplemente funciona – IdahoSixString