gpt4 book ai didi

node.js - NodeJS passport-ldapauth 总是返回 'Invalid Username/Password'

转载 作者:搜寻专家 更新时间:2023-11-01 00:04:46 25 4
gpt4 key购买 nike

我目前正在从事一个项目,在该项目中,我试图根据学校的 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}})'
}
}));

到目前为止,我为 bindDNsearchBase 尝试了很多不同的选项。我还有完整的 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 值没有传递到模块中,尽管在模块的 .prototype 中为两者执行了 console.log() .authenticate 函数显示值已正确传递到模块本身,因此我想问题一定出在我的配置中,尽管我不太了解模块和包装本身,无法弄清楚问题自己。

有人可以帮助我弄清楚为什么我的 NodeJS 应用程序无法成功验证用户身份吗?


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

OS: MacOSX HighSierra (10.13.3)
Node: v8.6.0
passport: v0.4.0
passport-ldapauth: v2.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}})'
}

关于node.js - NodeJS passport-ldapauth 总是返回 'Invalid Username/Password',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48763538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com