2010-08-04 12 views
9

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.

risposta

2

Errore 5 indica ERROR_ACCESS_DENIED, che suggerisce un problema relativo alle autorizzazioni. Detto questo, il seguente codice ha appena lavorato per me, in esecuzione su Windows 7 con il sito web in esecuzione come il pool di applicazioni di default:

contenuto di "corpo" del aspx pagina:

<asp:GridView ID="GridView1" runat="server"> 
</asp:GridView> 

Codice-dietro :

protected void Page_Load(object sender, EventArgs e) 
{ 
    var Context = new PrincipalContext(ContextType.Domain, "logon_domain", "username", "password"); 
    var principal = UserPrincipal.FindByIdentity(Context, "user_to_query"); 
    var groups = principal.GetAuthorizationGroups(); 

    GridView1.DataSource = groups; 
    GridView1.DataBind(); 
} 

Nel mio esempio logon_domain è stata la sinistra della domain_name\username, piuttosto che lo stile di specifica dominio aveva usato. La mia soluzione potrebbe non funzionare per te. In caso contrario, fa riferimento a un problema di autorizzazioni da qualche parte.

+0

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. –

+0

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

+1

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! –

5

Ho affrontato lo stesso problema. Vedi la discussione su una domanda simile. https://stackoverflow.com/a/8347817/2012977

soluzione è di seguito:

public List<GroupPrincipal> GetGroups(string userName) 
    { 
     var result = new List<GroupPrincipal>(); 
     PrincipalContext ctx = GetContext(); /*function to get domain context*/ 
     UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 
     if (user != null) 
     { 
      PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups(); 

      var iterGroup = groups.GetEnumerator(); 
      using (iterGroup) 
      { 
       while (iterGroup.MoveNext()) 
       { 
        try 
        { 
         Principal p = iterGroup.Current; 
         result.Add((GroupPrincipal) p); 
        } 
        catch (PrincipalOperationException) 
        { 
         continue; 
        } 
       } 
      } 
     } 

     return result; 
    } 
0

avere il vostro sguardo amministratore al conto AD per l'utente che restituisce il codice di errore 5. Mi sono imbattuto in che oggi e si è rivelato essere un'impostazione che l'utente di account. C'è una casella di controllo per ereditare le impostazioni di sicurezza che non sono state selezionate (tutti gli altri utenti sono stati controllati). Questo l'ha risolto per me.

Problemi correlati