Sto riscontrando un problema utilizzando il metodo GetAuthorizationGroups della classe UserPrincipal in un'applicazione Web.Errore nel metodo UserPrincipal.GetAuthorizationGroups()
utilizzando il seguente codice, che sto ricevendo "Durante il tentativo di recuperare i gruppi di autorizzazione, un errore (5) si è verificato"
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();
Credo che questo codice funziona in una misura.
- Quando osservo l'oggetto di contesto, posso vedere il server e nome utente/password sono stati risolti correttamente nell'oggetto
- Quando osservo l'oggetto p, posso vedere i dettagli AD sono stati popolati come il telefono no ecc.
Ecco la traccia dello stack dall'errore.
[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
Rimuovendo le nome utente e password dal costruttore PrincipalContext e cambiando l'ApplicationPool (in IIS7) per eseguire lo stesso account utente ([email protected]) - il seguente codice funziona.
PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM");
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs");
var groups = p.GetAuthorizationGroups();
ho bisogno di ottenere il codice nel primo esempio di lavorare - io non voglio correre il pool di applicazioni come utente del dominio solo per ottenere questo codice di lavoro.
Grazie Rob, ho provato molte combinazioni nel costruttore PrincipalContext senza fortuna. Penso che la causa principale del mio problema sia conoscere i requisiti di autorizzazione dell'utente dell'applicazione per richiamare il metodo GetAuthorizationGroups(). L'utente dell'applicazione ha letto tutti i diritti di informazione sugli oggetti nell'unità organizzativa. Attualmente sto facendo questo il lungo cammino leggendo la proprietà memberOf degli utenti. Questo howerver è solo il primo livello e non ricorsivo. –
FWIW, avevo una versione funzionante in cui ho usato 'var Contesto = nuovo PrincipalContext (ContextType.Dominio, "logon_domain"); ', quindi il contesto era puramente di dominio e funzionava anche senza errori in Win7/pool di applicazioni predefinito. La macchina su cui stai eseguendo il tuo codice su dominio è entrata? – Rob
Sì, aggiunto a un dominio. se utilizzo il costruttore PrincipalContext (ContextType.Domain, "logon_domain") con servizio di rete (AppPool) non funziona. Se cambio AppPool per l'esecuzione come lo stesso utente utilizzato nel metodo PrincipalContext (ContextType.Domain, null, "DC = MyCompany, DC = COM", "username", "password") funziona! –