Je rencontre un problème lors de l'utilisation de la méthode GetAuthorizationGroups de la classe UserPrincipal dans une application Web.Erreur avec la méthode UserPrincipal.GetAuthorizationGroups()
En utilisant le code suivant, je reçois « Tout en essayant de récupérer les groupes d'autorisation, une erreur (5) a été observée »
PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "username", "password");
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs");
var groups = p.GetAuthorizationGroups();
Je crois que ce code fonctionne dans une certaine mesure.
- Quand je regarde l'objet de contexte, je peux voir le serveur et le nom d'utilisateur/mot de passe ont été résolus correctement dans l'objet
- Quand je regarde l'objet p, je peux voir les détails AD ont été renseignés comme le téléphone ne
Voici la trace de la pile de l'erreur.
[PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.]
System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279
System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441
System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78
System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups() +11
En supprimant les détails du nom d'utilisateur et mot de passe du constructeur PrincipalContext et changer la ApplicationPool (en IIS7) pour exécuter le même utilisateur ([email protected]) - le code suivant fonctionne.
PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM");
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs");
var groups = p.GetAuthorizationGroups();
J'ai besoin d'obtenir le code dans le premier exemple au travail - je ne veux pas courir le pool d'applications en tant qu'utilisateur de domaine juste pour obtenir ce code de travail.
Merci Rob, j'ai essayé plusieurs combinaisons dans le constructeur PrincipalContext sans avoir de chance. Je pense que la cause première de mon problème est de connaître les conditions d'autorisation de l'utilisateur de l'application pour appeler la méthode GetAuthorizationGroups(). Mon utilisateur d'application a lu tous les droits d'informations sur les objets dans l'unité d'organisation. Actuellement, je fais cela le long chemin en lisant la propriété memberOf des utilisateurs. Ce howerver n'est que le premier niveau et non récursif. –
FWIW, j'avais une version de travail où j'ai utilisé 'var Context = new PrincipalContext (ContextType.Domain, "logon_domain"); ', donc le contexte était purement un domaine et qui a également travaillé sans erreur dans Win7/pool d'applications par défaut. La machine sur laquelle vous exécutez votre code est-elle connectée au domaine? – Rob
Oui, joint à un domaine. Si j'utilise le constructeur PrincipalContext (ContextType.Domain, "logon_domain") avec le service réseau (AppPool), cela ne fonctionne pas. Si je change l'AppPool pour s'exécuter comme le même utilisateur que celui utilisé dans la méthode PrincipalContext (ContextType.Domain, null, "DC = MonCompagnie, DC = COM", "nom d'utilisateur", "mot de passe") cela fonctionne! –