2016-09-30 31 views
0

我有一个nodejs应用程序与角前端。当我想用一个用户登录时,它只有在我输入ssha散列密码时才有效。但使用纯文本密码我无法登录。ldap身份验证登录只适用于输入散列密码

的LDAP客户端配置IST:

function auth(user, password, successFn){ 
    var opts ={ 
    scope: 'sub', 
    filter: '(&(objectClass=inetOrgPerson)(uid=' + user + '))', 
    }; 

    var callback = function (err, res){ 
    handleResult(collect, err, res); 
    }; 

    var collect = { 
    list: [], 
    entry: function(entry){ this.list.push(entry); }, 
    done: function(){ 
     var correct = this.list.length == 1; 
     if (correct){ 
     var pw = this.list[0].userPassword; 
     correct = (pw == password); 
     } 
     if (correct){ 
     var role = this.list[0].employeeType; 
     successFn(role[0]); 
     } 
     else{ 
     successFn(correct); 
     } 

    } 
    } 

router.post('/login', function(req, res, next) { 
    var user = req.body.username; 
    var pw = req.body.password; 

    ldap.auth(user, pw, function(role){ 
    if (role){ 
     req.session.user = user; 
     req.session.userRole = role; 

有什么错的代码或的NodeJS这是一个配置错误○LDAP服务器?我该如何解决这个问题?

回答

0

这看起来像是一个重要的安全问题。 您的代码未使用LDAP认证(即LDAP绑定请求)。它检索用户输入并将密码字段与用户输入进行比较。 但是大多数LDAP服务器会散列用户密码来保护它。 我强烈建议更改auth方法以执行绑定来验证密码,然后收集角色。

+0

这只是我的代码的一部分。我有一个ldpa.bind函数。我的问题是,ldap无法使用前端简单密码登录。它无法将其与根用户中的ssha散列密码进行比较。 – nolags

+0

LDAP服务器通过将用户输入的纯文本密码与他们保存在数据库中的散列且安全的版本进行比较来执行验证。如果您的用户失败,则表示用户DN不正确(无法找到用户)或密码不同。虽然您无法看到客户端身份验证失败的原因(出于安全原因),但服务器的日志应该能够更好地指示身份验证失败。请注意,根用户是特殊用户,并且通常与其他用户不在同一位置(这意味着您可能无法使用子树搜索找到它)。 –

+0

只有当我输入散列密码时,登录才会工作,它不适用于纯文本。你知道为什么吗? – nolags