Si vous utilisez .NET 3.5 ou une version ultérieure, vous pouvez utiliser le nouvel System.DirectoryServices.AccountManagement
espace de noms (S.DS.AM), ce qui rend cela beaucoup plus facile qu'auparavant.
Pour en savoir plus, cliquez ici: Gestion des principaux de sécurité d'annuaire dans .NET Framework 3.5
Mise à jour: les anciens articles du magazine MSDN ne sont plus en ligne, malheureusement - vous devrez télécharger le CHM pour le magazine MSDN de janvier 2008 de Microsoft et lire l'article qui s'y trouve.
Fondamentalement, vous devez avoir un "contexte principal" (généralement votre domaine), un principal utilisateur, puis vous obtenez ses groupes très facilement:
public List<GroupPrincipal> GetGroups(string userName)
{
List<GroupPrincipal> result = new List<GroupPrincipal>();
// establish domain context
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if(user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
// iterate over all groups
foreach(Principal p in groups)
{
// make sure to add only group principals
if(p is GroupPrincipal)
{
result.Add((GroupPrincipal)p);
}
}
}
return result;
}
et c'est tout ce qu'il y a! Vous avez maintenant un résultat (une liste) des groupes d'autorisation auxquels l'utilisateur appartient - parcourez-les, imprimez leurs noms ou tout ce que vous devez faire.
Mise à jour: pour accéder à certaines propriétés, qui ne sont pas visibles sur l' UserPrincipal
objet, vous devez creuser dans le sous-jacent DirectoryEntry
:
public string GetDepartment(Principal principal)
{
string result = string.Empty;
DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
return result;
}
Mise à jour n ° 2: semble ne devrait pas être trop difficile de mettre ces deux extraits de code ensemble ... mais ok - voilà:
public string GetDepartment(string username)
{
string result = string.Empty;
// if you do repeated domain access, you might want to do this *once* outside this method,
// and pass it in as a second parameter!
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, username);
// if user is found
if(user != null)
{
// get DirectoryEntry underlying it
DirectoryEntry de = (user.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
}
return result;
}
UserPrincipal
- voir ma réponse mise à jour pour savoir comment y accéder.GetAuthorizationGroups()
ne trouve pas les groupes imbriqués. Pour vraiment obtenir tous les groupes dont un utilisateur donné est membre (y compris les groupes imbriqués), essayez ceci:J'utilise
try/catch
parce que j'ai eu quelques exceptions avec 2 groupes sur 200 dans un très grand AD car certains SID n'étaient plus disponibles. (L'Translate()
appel effectue une conversion SID -> Nom.)la source
Tout d'abord, GetAuthorizationGroups () est une excellente fonction mais présente malheureusement 2 inconvénients:
Par conséquent, j'ai écrit une petite fonction pour remplacer GetAuthorizationGroups () par de meilleures performances et une sécurité d'erreur. Il ne fait qu'un seul appel LDAP avec une requête utilisant des champs indexés. Il peut être facilement étendu si vous avez besoin de plus de propriétés que les seuls noms de groupe (propriété "cn").
la source
Dans l'AD, chaque utilisateur a une propriété
memberOf
. Celui-ci contient une liste de tous les groupes auxquels il appartient.Voici un petit exemple de code:
la source
Dans mon cas, la seule façon pour moi de continuer à utiliser GetGroups () sans aucune suppression était d'ajouter l'utilisateur (USER_WITH_PERMISSION) au groupe qui a l'autorisation de lire l'AD (Active Directory). Il est extrêmement essentiel de construire le PrincipalContext en passant cet utilisateur et ce mot de passe.
Étapes que vous pouvez suivre dans Active Directory pour le faire fonctionner:
la source
Cela fonctionne pour moi
la source
La réponse dépend du type de groupes que vous souhaitez récupérer. L'
System.DirectoryServices.AccountManagement
espace de noms fournit deux méthodes de récupération de groupe:Donc,
GetGroups
obtient tous les groupes dont l'utilisateur est un membre direct etGetAuthorizationGroups
obtient tous les groupes d' autorisation dont l'utilisateur est un membre direct ou indirect .Malgré la façon dont ils sont nommés, l'un n'est pas un sous-ensemble de l'autre. Il peut y avoir des groupes renvoyés par
GetGroups
non retournés parGetAuthorizationGroups
et vice versa.Voici un exemple d'utilisation:
la source
Ma solution:
la source
Dans le cas où Translate fonctionne localement mais pas à distance, ei group. Traduire (typeof (NTAccount)
Si vous souhaitez que le code d'application s'exécute à l'aide de l'identité LOGGED IN USER, activez l'emprunt d'identité. L'emprunt d'identité peut être activé via IIS ou en ajoutant l'élément suivant dans le fichier web.config .
Si l'emprunt d'identité est activé, l'application s'exécute en utilisant les autorisations trouvées dans votre compte d'utilisateur. Donc, si l'utilisateur connecté a accès à une ressource réseau spécifique, alors seulement il pourra accéder à cette ressource via l'application.
Merci à PRAGIM tech pour ces informations de sa vidéo diligente
Authentification Windows dans asp.net Partie 87:
https://www.youtube.com/watch?v=zftmaZ3ySMc
Mais l'usurpation d'identité crée beaucoup de frais généraux sur le serveur
La meilleure solution pour autoriser les utilisateurs de certains groupes réseau est de refuser les anonymes dans la configuration web
<authorization><deny users="?"/><authentication mode="Windows"/>
et dans votre code derrière, de préférence dans le global.asax, utilisez le HttpContext.Current.User.IsInRole :
REMARQUE: Le groupe doit être écrit avec une barre oblique inverse \ ie "TheDomain \ TheGroup"
la source