2012-06-06 4 views
5

Tout d'abord, j'ai regardé la plupart des questions sur SO, mais aucune ne semble être exactement le même problème. Here est une question similaire, mais pas tout à fait la même chose. Dans mon cas, je crée une PrincipalContext en tant que tel:PrincipalContext.ValidateCredentials extrêmement lent

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


    If pctx.ValidateCredentials(userName, password) Then 

Le ADUserID est un compte de service.

Cette méthode fonctionne mais prend de 6 à 10 secondes.

J'ai également essayé de récupérer directement l'entrée de répertoire et la liaison sous-jacentes. C'est beaucoup plus rapide et fonctionne sur ma machine (qui est en dehors du domaine), mais pas sur le serveur web (qui est dans le domaine). Il échoue à l'appel DirectoryEntry.NativeObject. Je ne sais pas pourquoi. Malheureusement, je suis dans une situation où la seule façon de travailler est trop lente pour être réalisable. Y a-t-il un moyen d'accélérer cela?

Merci d'avance!

+0

Sur le serveur Web, avez-vous vérifié que vous pouvez vous authentifier, tout cela lentement, en utilisant la méthode PrincipalContext.ValidateCredentials? – Peter

+0

Oui, mais c'est terriblement lent. Les informations d'identification valides prennent 6 à 10 secondes, mais les informations d'identification non valides prennent deux fois plus de temps. –

Répondre

9

Essayez le code ci-dessous. Ce n'est peut-être pas plus rapide mais ce sera sympa de voir si ça marche.

Le nom d'utilisateur doit être sans le domaine inclus. Pour le domaine mon test vient d'utiliser le nom court, "DOMAIN", pas un DN ou même entièrement qualifié (votre salaire peut varier).

Ajoutez une référence à 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

Je vais essayer et vous le faire savoir. Je n'aurai pas d'opportunité avant demain. Merci! –

+0

Ok, j'ai finalement eu l'occasion d'essayer ça. C'est plus rapide que les deux méthodes que j'ai essayées plus tôt (généralement moins d'une seconde). Je vais faire quelques lectures sur MSDN à propos de cette classe/espace de noms. Merci. –

Questions connexes