2010-03-29 8 views
18

Attualmente sto cercando di autenticare tramite Active Directory Services utilizzando la classe PrincipalContext. Vorrei che la mia applicazione autentificasse il dominio usando i contesti Sealed e SSL. Per fare questo, devo usare the following constructor of PrincipalContext (link to MSDN page):Servizi Active Directory: PrincipalContext - Qual è il DN di un oggetto "contenitore"?

public PrincipalContext(
    ContextType contextType, 
    string name, 
    string container, 
    ContextOptions options 
) 

In particolare, sto utilizzando il costruttore come così:

PrincipalContext domainContext = new PrincipalContext(
    ContextType.Domain, 
    domain, 
    container, 
    ContextOptions.Sealing | ContextOptions.SecureSocketLayer); 

MSDN dice di "contenitore":

Il contenitore nel negozio da utilizzare come la radice del contesto. Tutte le query vengono eseguite in questa radice e tutti gli inserimenti vengono eseguiti in questo contenitore . Per domini e tipi di contesto ApplicationDirectory , questo parametro è il nome distinto (DN) di un oggetto contenitore.

Qual è il DN di un oggetto contenitore? Come posso scoprire qual è il mio oggetto contenitore? Posso interrogare il server Active Directory (o LDAP) per questo?

risposta

28

Beh, sono riuscito a capire il problema:

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain); 

domainContext.ValidateCredentials(userName, password, 
    ContextOptions.Negotiate | ContextOptions.SecureSocketLayer); 

Specificando le ContextOptions nel metodo ValidateCredentials (anziché nel costruttore), questo mi ha permesso di evitare di dover specificare un DN per un contenitore oggetto.

UPDATE:

Anche se vorrei chiarire che, dopo ulteriori sperimentazioni, ho scoperto che tutte le domande derivati ​​da questo oggetto PrincipalContext si svolge UN-criptato.

Apparentemente, quando le proprietà ContextOptions sono impostate in ValidateCredentials, tali opzioni vengono utilizzate solo per quella chiamata specifica di ValidateCredentials. Ma qui è dove si fa strano ...

Quindi, volevo che le mie interrogazioni al server AD venissero criptate pure. query di esempio:

UserPrincipal p = UserPrincipal.FindByIdentity(
    domainContext, IdentityType.SamAccountName, userName); 
var groups = p.GetGroups(); 
foreach (GroupPrincipal g in groups) { /* do something */ } 

Il codice sopra ottiene un elenco di tutti i gruppi che appartiene l'utente, ma avviene in chiaro (in chiaro). Quindi, dopo aver lavorato molto, ho scoperto che il DN non ha mai bisogno di essere impostato.

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain, 
    null,ContextOptions.Negotiate | ContextOptions.SecureSocketLayer); 

Ho scoperto che potevo impostare l'oggetto contenitore (DN) su null. E questo funziona bene. Impostandolo su una stringa vuota ("") si ottiene un'eccezione di un tipo sconosciuto, quindi non pensare di poterlo dare una stringa vuota.

Ed ecco la parte strana. Si potrebbe pensare che l'impostazione dell'opzione SecureSocketLayer in PrincipalContext significherebbe che non è necessario impostarlo esplicitamente quando si utilizza VerifyCredentials. Ma ho scoperto che se non l'avessi impostato nella parte VerifyCredentials, l'autenticazione fallirebbe, ma le query (come nell'esempio per i Gruppi) continuano a essere crittografate.

Forse non capisco ancora completamente l'autenticazione AD e le query, ma mi sembra un comportamento strano.

+1

La spiegazione per "la parte strana" era la chiave per correggere un ritardo di 20 secondi chiamando "ValidateCredentials". Grazie! –

+0

So che questo è super vecchio, ma sto studiando se usare o meno SSL su Signing e ho trovato questo post. Credo che potresti usare 'null' nel costruttore. Ecco come lo faccio quando voglio specificare ContextOptions. Esempio: 'var pc = new PrincipalContext (ContextType.Domain, Environment.UserDomainName, null, ContextOptions.Sealing);' – famousKaneis

+0

@nameless: Penso che sia ciò che il codice mostra nell'ultimo blocco di codice. (FWIW, ricordo a malapena di cosa si trattava, ma ricorda di essere stato davvero felice quando l'ho capito.) :) – Pretzel

Problemi correlati