51 votes

Voir si l'utilisateur fait partie du groupe Active Directory dans C # + Asp.net

J'ai besoin d'un moyen pour voir si un utilisateur fait partie d'un groupe Active Directory à partir de mon application .Net 3.5 asp.net c #.

J'utilise l'exemple d'authentification LDAP standard hors de msdn mais je ne vois pas vraiment comment comparer avec un groupe.

Merci pour toutes suggestions!

41voto

Nick Craver Points 313913

Avec 3.5 et System.DirectoryServices.AccountManagement, c'est un peu plus propre:

 public List<string> GetGroupNames(string userName)
{
  var pc = new PrincipalContext(ContextType.Domain);
  var src = UserPrincipal.FindByIdentity(pc, userName).GetGroups(pc);
  var result = new List<string>();
  src.ToList().ForEach(sr => result.Add(sr.SamAccountName));
  return result;
}
 

20voto

Dave Markle Points 44637

La solution de Nick Craver ne fonctionne pas pour moi dans .NET 4.0. Je reçois une erreur concernant un AppDomain non chargé. Au lieu d'utiliser cela, je l'ai utilisé (nous n'avons qu'un seul domaine). Cela vérifiera les groupes de groupes ainsi que l'appartenance directe à un groupe.

 using System.DirectoryServices.AccountManagement;

...

using (var ctx = new PrincipalContext(ContextType.Domain, yourDomain)) {
    using (var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, yourGroup)) {
        bool isInRole = grp != null && 
            grp
            .GetMembers(true)
            .Any(m => m.SamAccountName == me.Identity.Name.Replace(yourDomain + "\\", ""));
    }
}
 

16voto

Brandon Johnson Points 116

Le code ci-dessous fonctionnera dans .net 4.0

 private static string[] GetGroupNames(string userName)
{
    List<string> result = new List<string>();

    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
    {
        using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, userName).GetGroups(pc))
        {
            src.ToList().ForEach(sr => result.Add(sr.SamAccountName));
        }
    }

    return result.ToArray();
}
 

10voto

Adam Points 41

Solution la plus simple

 PrincipalContext pc = new PrincipalContext((Environment.UserDomainName == Environment.MachineName ? ContextType.Machine : ContextType.Domain), Environment.UserDomainName);

GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, "{GroupName}");
UserPrincipal up = UserPrincipal.FindByIdentity(pc, Environment.UserName);
up.IsMemberOf(gp);
 

7voto

p.campbell Points 42771

Cette méthode peut être utile si vous essayez de déterminer si l'utilisateur actuel authentifié par Windows est dans un rôle particulier.

 public static bool CurrentUserIsInRole(string role)
{
    try
    {
        return System.Web.HttpContext.Current.Request
                    .LogonUserIdentity
                    .Groups
                    .Any(x => x.Translate(typeof(NTAccount)).ToString() == role);
        }
        catch (Exception) { return false; }
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X