2008-11-27 15 views
5

¿Alguien sabe cómo hacer que WindowsPrincipal.IsInRole("domain\role") trabaje con grupos universales de Active Directory?WindowsPrincipal.IsInRole y grupos de directorios activos universales vs. globales

Digamos que el usuario actual es un miembro de un grupo llamado Rol en un dominio llamado dominio, y que el grupo Rol es un grupo Global en el directorio activo. El siguiente código sería entonces producir resultado = true:

WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 
bool result = wp.IsInRole(@"domain\Role"); 

Pero si el grupo de clases, se cambia a un grupo universal de los rendimientos del código resultado = false.

Respuesta

10

No encontré una buena respuesta a mi pregunta, lo que tenía que hacer era escribir una nueva clase Principal que escaneara el directorio para todos los grupos a los que pertenece el usuario, y escanear recursivamente todos los grupos para resolver grupos membresías grupales. Código provisto para usuarios con el mismo problema. No es el código más curioso que he escrito, pero al menos funciona.

uso como esto:

var wp = new WindowsPrincipalEx(WindowsIdentity.GetCurrent()); 
result = wp.IsInRole(@"domain\role"); 



public class WindowsPrincipalEx : IPrincipal 
{ 
    // Dictionary to store all groups, key = uppercase groupname, value = groupname as entered in AD 
    private Dictionary<string,string> completeGroupList = new Dictionary<string,string>(); 
    // Private vars 
    private WindowsIdentity identity; 
    private string domain; 

    // Identity property 
    public IIdentity Identity 
    { 
     get { return identity; } 
    } 

    // Constructor, accepts identity 
    public WindowsPrincipalEx(IIdentity identity) 
    { 
     this.identity = (WindowsIdentity)identity; 
     // Find domain name and store it for filtering purposes 
     if (identity.Name.Contains('\\')) 
      this.domain = identity.Name.Substring(0, identity.Name.IndexOf('\\') + 1); 

     // Find all groups this user belongs to, and store the list for later use 
     getRoles(completeGroupList); 
    } 

    public bool IsInRole(string role) 
    { 
     // Remove domain 
     if (role.StartsWith(domain, StringComparison.CurrentCultureIgnoreCase)) 
      role = role.Substring(domain.Length); 
     return completeGroupList.ContainsKey(role.ToUpper()); 
    } 

    private void getRoles(Dictionary<string,string> groupList) 
    { 
     // Find username and remove domain 
     string name = Identity.Name.Replace(domain,""); 

     // Find user in AD 
     DirectorySearcher search = new DirectorySearcher("(&(sAMAccountName="+name+")(objectCategory=user))"); 
     search.PropertiesToLoad.Add("memberof"); 

     SearchResult result = search.FindOne(); 
     if (result != null) 
     { 
      // Add all groups to the groupList dictionary 
      foreach (string s in result.Properties["memberOf"]) 
      { 
       string[] elements = s.Split(new char[] { ',' }); 
       foreach (string e in elements) 
        if (e.StartsWith("CN=", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         if (!groupList.ContainsKey(e.Substring(3).ToUpper())) 
          groupList.Add(e.Substring(3).ToUpper(),e.Substring(3)); 
         break; 
        } 
      } 
     } 

     // Scan through all groups found, and find group on group memberships recursevly 
     foreach (var ng in groupList.ToArray()) 
      getRolesInRoles(groupList, ng.Key); 
    } 

    private void getRolesInRoles(Dictionary<string, string> groupList, string roleName) 
    { 
     string name = roleName.Replace(domain, ""); 

     // Find group in AD 
     DirectorySearcher search = new DirectorySearcher("(&(cn="+name+")(objectCategory=group))"); 
     search.PropertiesToLoad.Add("memberof"); 

     SearchResult result = search.FindOne(); 
     if (result != null) 
     { 
      // Add all groups to the groupList dictionary 
      foreach (string s in result.Properties["memberOf"]) 
      { 
       string[] elements = s.Split(new char[] { ',' }); 
       foreach (string e in elements) 
        if (e.StartsWith("CN=", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         if (!groupList.ContainsKey(e.Substring(3).ToUpper())) 
         { 
          groupList.Add(e.Substring(3).ToUpper(),e.Substring(3)); 
          getRolesInRoles(groupList, e.Substring(3)); 
         } 
         break; 
        } 
      } 
     } 
    } 
} 
Cuestiones relacionadas