2013-07-22 38 views
11

tôi đang tạo ra một trang xác thực đăng nhập, nơi người dùng sẽ nhập có hoạt động tên thư mục và mật khẩu và sử dụng NodeJS tôi sẽ kiểm tra để xem nếu nó là hợp lệ, nhưng tôi tiếp tục nhận đượcNode JS LDAP Auth tài

[Error: LDAP Error Bad search filter] 

hoặc

[Error: Search returned != 1 results] 

Khi tôi đang cố gắng để tìm kiếm tên người dùng và mật khẩu, mã của tôi là dưới đây:

tôi đang sử dụng: https://github.com/jeremycx/node-LDAP, giả sử rằng người dùng đã nhập tên người dùng của hhill

var ldap = require('LDAP'); 
    var ldapServer = new ldap({ uri: 'ldap://batman.lan', version: 3}); 

    ldapServer.open(function(error) { 
     if(error) { 
      throw new Error('Cant not connect'); 
     } else { 
      console.log('---- connected to ldap ----'); 

      username = '(cn='+username+')'; 
      ldapServer.findandbind({ 
       base: 'ou=users,ou=compton,dc=batman,dc=lan', 
       filter: username, 
       password: password 
      }, function(error, data) { 
       if(error){ 
        console.log(error); 
       } else { 
        console.log('---- verified user ----'); 
       } 
      }); 
     } 
    }); 

Có ai có đề xuất gì về những gì tôi đang làm không?

CẬP NHẬT

Dưới đây là giải pháp tôi đã đưa ra nếu có ai bao giờ cần nó, với sự giúp đỡ của các câu trả lời dưới đây

var username = request.param('username'); 
    var password = request.param('password'); 

    var ldap = require('ldapjs'); 
    ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B; 
    var client = ldap.createClient({ 
      url: 'ldap://batman.com/cn='+username+', ou=users, ou=compton, dc=batman, dc=com', 
      timeout: 5000, 
      connectTimeout: 10000 
    }); 
    var opts = { 
     filter: '(&(objectclass=user)(samaccountname='+username+'))', 
     scope: 'sub', 
     attributes: ['objectGUID'] 
    }; 

    console.log('--- going to try to connect user ---'); 

    try { 
     client.bind(username, password, function (error) { 
      if(error){ 
       console.log(error.message); 
       client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
      } else { 
       console.log('connected'); 
       client.search('ou=users, ou=compton, dc=batman, dc=com', opts, function(error, search) { 
        console.log('Searching.....'); 

        search.on('searchEntry', function(entry) { 
         if(entry.object){ 
          console.log('entry: %j ' + JSON.stringify(entry.object)); 
         } 
        }); 

        search.on('error', function(error) { 
         console.error('error: ' + error.message); 
        }); 

        client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
       }); 
      } 
     }); 
    } catch(error){ 
     console.log(error); 
     client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
    } 
+0

Trong trường hợp đầu tiên, bộ lọc nào thực sự được truyền đến máy chủ? Trong trường hợp thứ hai, nhiều hơn một đối tượng khớp với các tham số tìm kiếm: có lẽ nó chỉ là một kết quả phù hợp. –

Trả lời

8

Trong trường hợp này, bạn cần ldapClient hơn ldapServer, đây là mã mẫu từ chính thức doc:

var ldap = require('ldapjs'); 

ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B; 

var client = ldap.createClient({ 
    url: 'ldap://127.0.0.1/CN=test,OU=Development,DC=Home' 
}); 

var opts = { 
    filter: '(objectclass=user)', 
    scope: 'sub', 
    attributes: ['objectGUID'] 
}; 

client.bind('username', 'password', function (err) { 
    client.search('CN=test,OU=Development,DC=Home', opts, function (err, search) { 
    search.on('searchEntry', function (entry) { 
     var user = entry.object; 
     console.log(user.objectGUID); 
    }); 
    }); 
}); 
+1

Tôi đã thử ở trên, tôi nhận được lỗi sau oSuchObjectError: 0000208D: NameErr: DSID-0310020A, vấn đề 2001 (NO_OBJECT), dữ liệu 0, kết quả phù hợp nhất: \t 'OU = Người dùng, OU = Newyork, DC = basingloc , DC = lan ' Kết nối, nhưng tìm kiếm không thành công. trên dòng search.on @sza – Sukh

+0

Chỉ các sự cố đã được khắc phục mà tôi đã sử dụng giải pháp này. Cảm ơn bạn @zsong! –

7

@Suk h Cảm ơn bạn đã đăng giải pháp UPDATE của mình; tuy nhiên, có vấn đề với mã bạn đã đăng trong UPDATE của mình. Trong khi nó hoạt động cho các trường hợp đơn giản, với các truy vấn lớn hơn, bạn sẽ thấy rằng bạn đang unbinding trước khi kết quả đã được đầu ra. Các giải pháp cho tôi là để di chuyển unbinds của bạn vào các chức năng search.on.

Dưới đây là một chỉnh sửa của CẬP NHẬT của bạn:

var ldap = require('ldapjs'); 
ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B; 
var client = ldap.createClient({ 
     url: 'ldap://batman.com/cn='+username+', ou=users, ou=compton, dc=batman, dc=com', 
     timeout: 5000, 
     connectTimeout: 10000 
}); 
var opts = { 
    filter: '(&(objectclass=user)(samaccountname='+username+'))', 
    scope: 'sub', 
    //attributes: ['objectGUID'] 
    // This attribute list is what broke your solution 
    attributes: ['objectGUID','sAMAccountName','cn','mail','manager','memberOf'] 
}; 

console.log('--- going to try to connect user ---'); 

try { 
    client.bind(username, password, function (error) { 
     if(error){ 
      console.log(error.message); 
      client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
     } else { 
      console.log('connected'); 
      client.search('ou=users, ou=compton, dc=batman, dc=com', opts, function(error, search) { 
       console.log('Searching.....'); 

       search.on('searchEntry', function(entry) { 
        if(entry.object){ 
         console.log('entry: %j ' + JSON.stringify(entry.object)); 
        } 
        client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
       }); 

       search.on('error', function(error) { 
        console.error('error: ' + error.message); 
        client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
       }); 

       // don't do this here 
       //client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
      }); 
     } 
    }); 
} catch(error){ 
    console.log(error); 
    client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}}); 
} 

Ít nhất đây là những gì tôi phát hiện ra khi sử dụng giải pháp của bạn với các tìm kiếm Active Directory. memberOf trả về rất nhiều mục trong trường hợp sử dụng của tôi và các unbinds đã được thực hiện sớm, vì vậy tôi đã nhận được lỗi sau:

error: 1__ldap://my.domain.com/,OU=Employees,OU=Accounts,DC=my,DC=domain,DC=com closed 
client disconnected