2012-08-28 34 views
8

Tôi không thể xác thực người dùng bằng LDAP. Tôi đã nhận được thông tin sau:LDAP: Cách xác thực người dùng bằng các chi tiết kết nối

URL=ldap://10.10.10.10:389 
LDAP BASE:DC=lab2,DC=ins 
LDAP Bind Account: CN=Ldap Bind,OU=Service Accounts,OU=TECH,DC=lab2,DC=ins 
LDAP Bind Account Pw: secret 

Tôi có thể tìm kiếm một giá trị sAMAccountName sử dụng chi tiết trên, nhưng làm thế nào để xác thực người dùng với tên người dùng và mật khẩu?
Nếu bạn làm theo các câu hỏi trước của tôi thì bạn sẽ hiểu rằng, tôi thành công có thể kết nối với máy chủ LDAP nhưng không thể xác thực anh ấy.
tài khoản để xác thực:

user: someusername 
password: somepwd 

Tôi không thể kết nối với máy chủ LDAP với 'somepwd' và làm thế nào tôi nên sử dụng someusername. Tôi có thể tìm kiếm người dùng đã cho là sAMAccountName.

+1

bạn có mật khẩu chính xác không? nó hoạt động bằng cách sử dụng một khách hàng như JXplorer? – dbrin

+0

@DmitryB Tôi có thể kết nối với máy chủ bằng 'bí mật' nhưng không kết nối với 'somepwd'. –

+0

sai mật khẩu hơn :) – dbrin

Trả lời

22

Đây là một mashup thứ mà tôi tìm thấy ở những nơi khác nhau. Nó sẽ đưa bạn dọc theo đường dẫn chính xác nếu bạn không muốn sử dụng UnboundID SDK. Đây không phải là chất lượng sản xuất, bạn có thể muốn thêm nội dung SSL vào đây nếu cửa hàng của bạn hỗ trợ nó.

public static Boolean validateLogin(String userName, String userPassword) { 
    Hashtable<String, String> env = new Hashtable<String, String>(); 


    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldap://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN); 

    // To get rid of the PartialResultException when using Active Directory 
    env.put(Context.REFERRAL, "follow"); 

    // Needed for the Bind (User Authorized to Query the LDAP server) 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, LDAP_BIND_DN); 
    env.put(Context.SECURITY_CREDENTIALS, LDAP_BIND_PASSWORD); 

    DirContext ctx; 
    try { 
     ctx = new InitialDirContext(env); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } 

    NamingEnumeration<SearchResult> results = null; 

    try { 
     SearchControls controls = new SearchControls(); 
     controls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search Entire Subtree 
     controls.setCountLimit(1); //Sets the maximum number of entries to be returned as a result of the search 
     controls.setTimeLimit(5000); // Sets the time limit of these SearchControls in milliseconds 

     String searchString = "(&(objectCategory=user)(sAMAccountName=" + userName + "))"; 

     results = ctx.search("", searchString, controls); 

     if (results.hasMore()) { 

      SearchResult result = (SearchResult) results.next(); 
      Attributes attrs = result.getAttributes(); 
      Attribute dnAttr = attrs.get("distinguishedName"); 
      String dn = (String) dnAttr.get(); 

      // User Exists, Validate the Password 

      env.put(Context.SECURITY_PRINCIPAL, dn); 
      env.put(Context.SECURITY_CREDENTIALS, userPassword); 

      new InitialDirContext(env); // Exception will be thrown on Invalid case 
      return true; 
     } 
     else 
      return false; 

    } catch (AuthenticationException e) { // Invalid Login 

     return false; 
    } catch (NameNotFoundException e) { // The base context was not found. 

     return false; 
    } catch (SizeLimitExceededException e) { 
     throw new RuntimeException("LDAP Query Limit Exceeded, adjust the query to bring back less records", e); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } finally { 

     if (results != null) { 
      try { results.close(); } catch (Exception e) { /* Do Nothing */ } 
     } 

     if (ctx != null) { 
      try { ctx.close(); } catch (Exception e) { /* Do Nothing */ } 
     } 
    } 
} 
+2

đây là giải pháp tốt nhất mà tôi đã thấy cho đến nay, tôi đã đặc biệt tìm kiếm xác thực người dùng sau khi liên kết với máy chủ LDAP. – likeToCode

+0

Tính năng này có an toàn để sử dụng với kết nối tổng hợp không? – bdrx

7

Kết nối LDAP bắt đầu là anonymous. Để thay đổi trạng thái ủy quyền của kết nối, hãy sử dụng yêu cầu BIND. Yêu cầu BIND có hai dạng, 'đơn giản' hoặc 'SASL'. Yêu cầu BIND 'đơn giản' có một tên và mật khẩu phân biệt. Yêu cầu BIND phải được truyền qua kết nối an toàn hoặc kết nối không an toàn được quảng bá đến kết nối an toàn bằng cách sử dụng yêu cầu mở rộng StartTLS.

Sử dụng UnboundID LDAP SDK:

// exception handling not shown 
LDAPConnection ldapConnection = new LDAPConnection(hostname,port); 
BindRequest bindRequest = new SimpleBindRequest(username,password); 
BindResult bindResult = ldapConnection.bind(bindRequest); 
if(bindResult.getResultCode().equals(ResultCode.SUCCESS)) { 
    /// successful authentication 
} 
ldapConnection.close(); 
+0

Tôi không thể sử dụng UnboundID LDAP SDK do các hạn chế của khách hàng. Có cách nào khác để đạt được nó không? –

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