NodeJS passport-ldapauth始终返回'无效的用户名/密码'

时间:2018-02-13 09:35:37

标签: node.js authentication passport.js

我目前正在开展一个项目,我正在尝试根据学校的LDAP服务器对用户进行身份验证。为此,我尝试使用NPM包passport-ldapauth

事先说:我100%确定提供的usernamepassword已在LDAP服务器上注册并生效。

以下是我目前尝试使用的代码,用于在我的NodeJS应用程序中对本地LDAP服务器进行身份验证:

var LDAPStrategy = require('passport-ldapauth').Strategy;

passport.serializeUser(function (user, done) {
 done(null, user);
});

passport.deserializeUser(function (id, done) {
 done(null, id);
});

passport.use('ldap', new LDAPStrategy({
 usernameField: 'username',
 passwordField: 'password',
  server: {
   url: 'ldap://server-ip-address:389',
   bindDN: 'cn=read-only-user,dc=foo,dc=bar',
   bindCredentials: 'read-only-user-pw',
   searchBase: 'dc=foo,dc=bar',
   searchFilter: '(sAMAccountName={{username}})'
 }
}));

到目前为止,我为bindDN以及searchBase尝试了许多不同的选项。我也有完整的bindDN,看起来像这样:

bindDN: CN=read-only-user,OU=LDAP,OU=AdFoo,OU=Userfoo,OU=FOO,DC=foo,DC=bar

searchBase这样:

searchBase: 'ou=Foobar,ou=Anotherfoobar,ou=FOO,dc=foo,dc=bar'

不幸的是,虽然似乎没有任何工作可行。 我已经检查了这些参数(username, password)是否在请求的正文中给出,它们是。

router.post('/', (req, res, next) => {
 // Prints the values that the frontend passes in the request body
 console.log(req.body.username); 
 console.log(req.body.password);
 next();
});

router.post('/', bodyParseArray, passport.authenticate('ldap', (err, user, info) => {
 console.log('Error: ', err); // prints: null
 console.log('User: ', user); // prints: false
 console.log('Info: ', info); // prints: { message: 'Invalid username/password' }
}));

我也尝试使用终端进行ldapsearch。这个ldapsearch对我来说如下:

MBP-Stoger:~ Stephan$ ldapsearch -H ldap://server-ip-address:389 
-D cn=read-only-user,ou=LDAP,ou=AdFoo,ou=Userfoo,ou=FOO,dc=foo,dc=bar
-w read-only-user-pw -b ou=Foobar,ou=Anotherfoobar,ou=FOO,dc=foo,dc=bar 
"sAMAccountName=example.user"
# extended LDIF
#
# LDAPv3
# base <ou=Foobar,ou=Anotherfoobar,ou=FOO,dc=foo,dc=bar> with scope subtree
# filter: sAMAccountName=example.user
# requesting: ALL
#

# search result
search: 2
result: 0 Success

# numResponses: 1

据我所知,似乎ldapsearch返回了预期的结果,但NodeJS模块似乎对它接收的任何输入都有一些问题。最后我想也许username/password值没有被传递到模块中,尽管在模块的console.log()函数中为.prototype.authenticate执行OS: MacOSX HighSierra (10.13.3) Node: v8.6.0 passport: v0.4.0 passport-ldapauth: v2.0.0 表示值是正确地被传递到模块本身,因此我想这个问题必须放在我的配置中的某个地方,尽管我不了解模块并将其打包得很好以便自己解决问题。

那里的任何人都可以帮我弄清楚为什么我的NodeJS应用程序无法成功验证用户?

最后,一些规范信息,如果有必要:

<?php do { ?>
    <?php if($row_daftaruser['stt'] == 1): ?>
        <tr>
            <td><?php echo $row_daftaruser['id']; ?></td>
            <td><?php echo $row_daftaruser['nama']; ?></td>
            <td><?php echo $row_daftaruser['email']; ?></td>
            <td><?php echo $row_daftaruser['username']; ?></td>
            <td><?php echo $row_daftaruser['password']; ?></td>
            <td><?php echo $row_daftaruser['alamat']; ?></td>
            <td><?php echo $row_daftaruser['tgl_lahir']; ?></td>
            <td><?php echo $row_daftaruser['stt']; ?></td>
        </tr>
    <?php endif ?>
<?php } while ($row_daftaruser = mysqli_fetch_assoc($daftaruser)); ?>

1 个答案:

答案 0 :(得分:0)

我面临着同样的问题,组织单位(OU)遇到了问题。您需要在bindDN中提及ou,ou = Users,并且如果只读用户是另一个ou的一部分,我们也需要提及。因此,此代码需要为您工作。

server: {
   url: 'ldap://server-ip-address:389',
   bindDN: 'cn=read-only-user,ou=Users,ou=user-other-ou,dc=foo,dc=bar',
   bindCredentials: 'read-only-user-pw',
   searchBase: 'dc=foo,dc=bar',
   searchFilter: '(sAMAccountName={{username}})'
}