2016-09-30 33 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