2012-06-06 23 views
5

En primer lugar, he visto la mayoría de las preguntas en SO, pero ninguna parece ser exactamente la misma. Here es una pregunta similar, pero no del todo igual. En mi circunstancia, estoy creando una PrincipalContext como tal:PrincipalContext.ValidateCredentials extremadamente lento

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


    If pctx.ValidateCredentials(userName, password) Then 

El ADUserID es una cuenta de servicio.

Este método funciona, pero tarda más de 6-10 segundos.

También intenté recuperar la entrada del directorio subyacente y el enlace directamente. Esto es mucho más rápido y funciona en mi máquina (que está fuera del dominio), pero no en el servidor web (que está dentro del dominio). Falla en la llamada DirectoryEntry.NativeObject. No sé por qué. Lamentablemente, estoy en una situación en la que la única forma de hacerlo funcionar es demasiado lenta para que sea factible. ¿Hay alguna manera de acelerar esto?

¡Gracias de antemano!

+0

En el servidor web, ¿ha verificado que puede autenticarse, todo lentamente, utilizando el método PrincipalContext.ValidateCredentials? – Peter

+0

Sí, pero es dolorosamente lento. Las credenciales válidas demorarán entre 6 y 10 segundos; sin embargo, las credenciales no válidas tardan más del doble. –

Respuesta

9

Pruebe el código siguiente. Puede que no sea más rápido, pero será bueno ver si funciona.

El nombre de usuario debe contener el dominio. Para el dominio, mi prueba solo usó el nombre corto, "DOMINIO", no un DN o incluso totalmente calificado (su kilometraje puede variar).

Agregue una referencia 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

Haré esto una prueba y te lo haré saber. No tendré oportunidad hasta mañana. ¡Gracias! –

+0

Ok, finalmente tuve la oportunidad de probar esto. Es más rápido que ambos métodos que he probado antes (generalmente menos de un segundo). Voy a leer algo en MSDN sobre esta clase/espacio de nombres. Gracias. –

Cuestiones relacionadas