我目前正在开展一个项目,我正在尝试根据学校的LDAP服务器对用户进行身份验证。为此,我尝试使用NPM包passport-ldapauth
。
事先说:我100%确定提供的username
和password
已在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)); ?>
答案 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}})'
}