2010-12-06 20 views
12

Tengo un código que utilizo para comprobar si el usuario es miembro de la AD, funcionó perfectamente,C# comprobar si el usuario miembro de un grupo?

ahora quiero agregar la posibilidad de comprobar si el usuario también es miembro de un grupo.

lo que necesito modificar para lograr eso, hice algo de trabajo, pero falla!

así que aquí es mi código:

 //Authenticate a User Against the Directory 
     private bool Authenticate(string userName,string password, string domain) 
     { 

      if (userName == "" || password == "") 
      { 
       return false; 
      } 

      bool authentic = false; 
      try 
      { 
       DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,userName, password); 
       object nativeObject = entry.NativeObject; 
       authentic = true; 
      } 
      catch (DirectoryServicesCOMException) { } 
      return authentic; 
     } 

quiero que sea así:

private bool Authenticate(string userName,string password, string domain, string group) 
+0

Puede estar utilizando la API incorrecta para esta tarea. ¿Estás escribiendo código de autenticación para una aplicación? Si es así, debería haber una API mucho más simple de usar. Por ejemplo, en ASP.NET, puede acceder a esta información utilizando el objeto Page.User. ¿O el propósito de la aplicación es realmente consultar a Active Directory? – David

Respuesta

6

lo resuelvo con este código

public bool AuthenticateGroup(string userName, string password, string domain, string group) 
    { 


     if (userName == "" || password == "") 
     { 
      return false; 
     } 

     try 
     { 
      DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password); 
      DirectorySearcher mySearcher = new DirectorySearcher(entry); 
      mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))"; 
      SearchResult result = mySearcher.FindOne(); 

      foreach (string GroupPath in result.Properties["memberOf"]) 
      { 
       if (GroupPath.Contains(group)) 
       { 
        return true; 
       } 
      } 
     } 
     catch (DirectoryServicesCOMException) 
     { 
     } 
     return false; 
    } 

funciona bien para mí, y se puede utilizar con una máquina que no forma parte del controlador de dominio/Active Directory

Gracias a todos por la ayuda

21

Esto no está disponible en Windows XP o anterior.

De todos modos, con el fin de comprobar la pertenencia a un grupo, puede utilizar este código:

bool IsInGroup(string user, string group) 
{ 
    using (var identity = new WindowsIdentity(user)) 
    { 
     var principal = new WindowsPrincipal(identity); 
     return principal.IsInRole(group); 
    } 
} 
+0

¡Utilicé este código con diferentes usuarios y contraseñas de una máquina que no es miembro de DC! ¡y funciona! –

+0

Gracias, pero ¿cómo integrar esto en mi código? ¡el "usuario de cadena" me está confundiendo! también hay algún documento que pueda ver? –

+0

Es el nombre de usuario en el dominio. Probablemente funcione solo con el nombre de usuario si la máquina está en el mismo dominio, o puede funcionar con * usuario @ dominio * o * dominio \ usuario *. – Ran

7

En ASP.Net que va a utilizar Page.User.IsInRole("RoleName") o en Windows puede utilizar System.Threading.Thread.CurrentPrincipal.IsInRole("RoleName")

+0

"RoleName" es el nombre de "Grupo"? –

+0

Sí, un usuario puede pertenecer a varios Roles (grupos). – jvanrhyn

Cuestiones relacionadas