2012-06-06 35 views
5

Trước hết, tôi đã xem xét hầu hết các câu hỏi trên SO, nhưng dường như không có vấn đề nào giống hệt nhau. Here là một câu hỏi tương tự, nhưng không hoàn toàn giống nhau. Trong trường hợp của tôi, tôi đang tạo một PrincipalContext như vậy:PrincipalContext.ValidateCredentials cực kỳ chậm

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


    If pctx.ValidateCredentials(userName, password) Then 

ADUserID là tài khoản dịch vụ.

Phương pháp này hoạt động nhưng mất tối đa 6-10 giây.

Tôi cũng đã cố truy xuất mục nhập thư mục cơ bản và liên kết trực tiếp. Điều này là nhanh hơn nhiều và hoạt động trên máy tính của tôi (mà là bên ngoài tên miền), nhưng không phải trên máy chủ web (mà là bên trong tên miền). Nó không thành công trong cuộc gọi DirectoryEntry.NativeObject. Tôi không biết tại sao. Thật không may, tôi đang ở trong một tình huống mà cách duy nhất đang hoạt động là quá chậm để khả thi. Có cách nào để tăng tốc độ này không?

Cảm ơn trước!

+0

Trên máy chủ web, bạn đã xác minh rằng bạn có thể xác thực, tất cả đều chậm, sử dụng phương thức PrincipalContext.ValidateCredentials? – Peter

+0

Có, nhưng nó rất chậm. Thông tin đăng nhập hợp lệ sẽ mất 6-10 giây, tuy nhiên, thông tin xác thực không hợp lệ mất hơn gấp đôi. –

Trả lời

9

Hãy thử mã bên dưới. Nó có thể không nhanh hơn nhưng nó sẽ được tốt đẹp để xem nếu nó hoạt động.

Tên người dùng không được bao gồm tên miền. Đối với tên miền, thử nghiệm của tôi chỉ sử dụng tên ngắn, "DOMAIN", không phải DN hoặc thậm chí đủ điều kiện (milage của bạn có thể thay đổi).

Thêm tham chiếu đến 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

Tôi sẽ thử và cho bạn biết. Tôi sẽ không có cơ hội cho đến ngày mai. cảm ơn! –

+0

Ok, cuối cùng tôi đã có cơ hội để thử điều này. Nó nhanh hơn cả hai phương pháp tôi đã thử trước đó (thường ít hơn một giây). Tôi sẽ làm một số đọc trên MSDN về lớp/không gian tên này. Cảm ơn. –

Các vấn đề liên quan