2010-12-06 2 views
12

J'ai un code que j'utilise pour vérifier si l'utilisateur est membre de l'AD, a parfaitement fonctionné,C# vérifier si l'utilisateur est membre d'un groupe?

maintenant je veux ajouter la possibilité de vérifier si l'utilisateur aussi un membre d'un groupe!

Que dois-je modifier pour y parvenir, j'ai fait du travail, mais ça échoue!

alors voici mon code:

 //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; 
     } 

Je veux faire comme ceci:

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

Vous utilisez peut-être la mauvaise API pour cette tâche. Ecrivez-vous du code d'authentification pour une application? Si c'est le cas, il devrait y avoir une API beaucoup plus simple à utiliser. Par exemple, dans ASP.NET, vous pouvez accéder à ces informations à l'aide de l'objet Page.User. Ou le but de l'application est-il d'interroger Active Directory? – David

Répondre

6

Je résous avec ce code

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; 
    } 

cela fonctionne bien pour moi, et il peut être utilisé avec une machine ne fait pas partie du contrôleur de domaine/Active Directory

Merci à tous pour l'aide

21

Ce n'est pas disponible sous Windows XP ou une version antérieure.

Quoi qu'il en soit, afin de vérifier l'appartenance de groupe, vous pouvez utiliser ce code:

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

J'ai utilisé ce code avec différents utilisateurs et mots de passe d'une machine qui n'est pas membre du DC! et il fonctionne! –

+0

Merci, mais comment intégrer cela dans mon code? le "utilisateur de chaîne" me confond! est-ce qu'il y a aussi un document que je peux regarder? –

+0

C'est le nom d'utilisateur dans le domaine. Il fonctionnera probablement avec juste le nom d'utilisateur si la machine est dans le même domaine, ou il peut fonctionner avec * user @ domain * ou * domain \ user *. – Ran

7

En ASP.Net vous utiliserez Page.User.IsInRole("RoleName") ou sous Windows, vous pouvez utiliser System.Threading.Thread.CurrentPrincipal.IsInRole("RoleName")

+0

"NomRôle" est le nom "Groupe"? –

+0

Oui, un utilisateur peut appartenir à différents rôles (groupes). – jvanrhyn

Questions connexes