2012-06-06 14 views
5

Prima di tutto, ho esaminato la maggior parte delle domande su SO, ma nessuna sembra essere esattamente lo stesso problema. Here è una domanda simile, ma non del tutto uguale. Nel mio circostanza, Sto creando un PrincipalContext come tale:PrincipalContext.ValidateCredentials estremamente lento

Dim pctx As PrincipalContext = New PrincipalContext(ContextType.Domain, fullyqualifieddomain, container, ADUserID, ADPassword) 


    If pctx.ValidateCredentials(userName, password) Then 

L'ADUserID è un account di servizio.

Questo metodo funziona, ma richiede fino a 6-10 secondi.

Ho anche provato a recuperare direttamente la voce della directory sottostante e il binding. Questo è molto più veloce e funziona sulla mia macchina (che è esterna al dominio), ma non sul server web (che si trova all'interno del dominio). Non riesce alla chiamata DirectoryEntry.NativeObject. Non so perché. Sfortunatamente, mi trovo in una situazione in cui l'unico modo in cui funziona è troppo lento per essere fattibile. C'è un modo per accelerare questo?

Grazie in anticipo!

+0

Sul server Web è stato verificato che è possibile eseguire l'autenticazione, tutto lentamente, utilizzando il metodo PrincipalContext.ValidateCredentials? – Peter

+0

Sì, ma è dolorosamente lento. Le credenziali valide impiegheranno 6-10 secondi, tuttavia le credenziali non valide impiegano il doppio del tempo. –

risposta

9

Prova il codice qui sotto. Potrebbe non essere più veloce ma sarà bello vedere se funziona.

Il nome utente deve essere senza il dominio incluso. Per il dominio il mio test ha utilizzato solo il nome breve, "DOMAIN", non un DN o anche completamente qualificato (la tua milage può variare).

Aggiungere un riferimento a System.DirectoryServices.Protocols.

using System.DirectoryServices.Protocols; 

public static bool Authenticate(string username, string password, string domain) 
{ 
    try 
    { 
     //string userdn; 
     using (LdapConnection lconn = new LdapConnection(new LdapDirectoryIdentifier(domain))) 
     { 
      lconn.Bind(new System.Net.NetworkCredential(username, password, domain)); 
      return true; 
     } 
    } 
    catch (LdapException e) 
    { 
     return false; 
    } 
} 

if (Authenticate("username", "password", "domain")) { } 
+0

Darò una prova e ti faccio sapere. Non avrò un'opportunità fino a domani. Grazie! –

+0

Ok, ho finalmente avuto la possibilità di provare questo. È più veloce di entrambi i metodi che ho provato in precedenza (in genere meno di un secondo). Sto andando a fare qualche lettura su MSDN su questa classe/spazio dei nomi. Grazie. –

Problemi correlati