2012-06-06 10 views
5

Po pierwsze, przyjrzałem się większości pytań na SO, ale żaden nie wydaje się być dokładnie tym samym problemem. Here to podobne pytanie, ale nie do końca takie samo. W mojej sytuacji utworzę podstawową treść jako taką:PrincipalContext.ValidateCredentials bardzo wolno

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


    If pctx.ValidateCredentials(userName, password) Then 

ADUserID to konto usługi.

Ta metoda działa, ale trwa dłużej niż 6-10 sekund.

Próbowałem również bezpośrednio pobrać pozycję katalogu podstawowego i powiązanie. Jest to znacznie szybsze i działa na moim komputerze (który znajduje się poza domeną), ale nie na serwerze internetowym (który znajduje się w domenie). Błąd kończy się wywołaniem DirectoryEntry.NativeObject. Nie wiem dlaczego. Niestety, jestem w sytuacji, w której jedyny sposób, który działa, jest zbyt wolny, aby był wykonalny. Czy istnieje sposób, aby to przyspieszyć?

Z góry dziękuję!

+0

na serwerze WWW czy sprawdzeniu, że można uwierzytelnić, wszyscy się go powoli, stosując metodę PrincipalContext.ValidateCredentials? – Peter

+0

Tak, ale jest boleśnie powolny. Prawidłowe poświadczenia będą trwały 6-10 sekund, jednak nieprawidłowe poświadczenia zajmują dwa razy dłużej. –

Odpowiedz

9

Wypróbuj poniższy kod. Może nie być szybszy, ale dobrze będzie zobaczyć, czy to działa.

Nazwa użytkownika nie powinna zawierać domeny. W przypadku domeny w moim teście użyto krótkiej nazwy "DOMAIN", a nie nazwy DN lub nawet w pełni kwalifikowanej (twój przebieg może się różnić).

Dodaj odniesienie do 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

Dam to spróbować i dam ci znać. Nie będę miał okazji do jutra. dzięki! –

+0

Ok, w końcu mam szansę spróbować. Jest szybszy niż obie metody, które wypróbowałem wcześniej (na ogół mniej niż sekundę). Mam zamiar zrobić trochę czytania na MSDN o tej klasie/przestrzeni nazw. Dzięki. –