2012-01-03 12 views
7

Quindi ho una domanda onestamente non sono abbastanza sicuro di come chiedere. Essenzialmente ho un po 'di codice che funziona in modo fantastico sul mio computer locale quando lo eseguo. Una volta che lo pubblico sul nostro web server di sviluppo, fallisce. Non sono sicuro che si tratti di un problema di installazione di IIS, di un problema di web.config o di un problema di codifica.C# Directory attiva PrincipalContext/UserPrincipal.IsMemberOf error

Ecco il frammento di codice

bool isMember = false; 

    PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain); 
    UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

    if (user.IsMemberOf(ADDomain, IdentityType.Name, groupName.Trim())) 
    { 
     isMember = true; 
    } 

    return isMember; 

Dove mi passa in un nome utente e un gruppo e mi dice se l'utente è un membro di tale gruppo. Nessun problema. Funziona alla grande sulla mia macchina. Sono andato a pubblicare quel codice al server web e viene a mancare quando colpisce la linea

UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

getta questo errore:

[DirectoryServicesCOMException (0x80072020): An operations error occurred.]
System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +788
System.DirectoryServices.DirectoryEntry.Bind() +44
System.DirectoryServices.DirectoryEntry.get_AdsObject() +42
System.DirectoryServices.PropertyValueCollection.PopulateList() +29
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +63
System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +163 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +521217
System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +51
System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +141
System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +42
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) +29
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue) +95
Cosmic.Web.Login.btnSubmit_Click(Object sender, EventArgs e) in C:\cosmic\Cosmic.Web\Login.aspx.cs:79
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3691

Tutte le idee in cui questo potrebbe essere fallendo?

risposta

17

La mia prima ipotesi sarebbe: l'account utente su cui si sta eseguendo questo codice non ha le autorizzazioni necessarie per eseguire una query in Active Directory.

Per risolvere questo problema, in sostanza è necessario modificare il vostro costruttore da questo:

PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain); 

(stabilisce una connessione con AD con gli attuali, le credenziali di default di questo codice è in esecuzione in)

a this:

PrincipalContext ADDomain = 
    new PrincipalContext(ContextType.Domain, "DOMAIN", useraccount, password); 

e fornire un nome utente e una password per un account utente che si conosce ha privilegi sufficienti t o interrogare Active Directory.

+1

Sai cosa, è quello che era. Il server web non ha le credenziali giuste per colpire Active Directory. Metti alcune credenziali lì e funziona un po 'meglio. Grazie! – Seril

Problemi correlati