gpt4 book ai didi

node.js - 在 Node.js 上使用 Passport-ldapauth 的 LDAP 身份验证失败

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:57 31 4
gpt4 key购买 nike

嗨,我是 openldap 和 nodejs 的新手。我正在尝试创建 openldap 身份验证并使用一个简单的 Node 应用程序来测试针对本地 ldap 服务器的身份验证。

我的理解是,我可以创建 ldap 服务器并添加 Apache Directory Studio 中的所有用户。然后编写一个简单的 Node 应用程序,其配置与ldap服务器相同。使用 postman 发送身份验证请求,我应该能够得到授权结果。如果我错了,请纠正我。

以下是我采取的步骤:

  1. 我使用 Apache Directory Studio 在本地设置了 LDAP 服务器。

  2. 然后我尝试设置一个简单的nodejs应用程序(代码如下所示)。

  3. 当我使用 Postman 向之前使用 Apache Directory Studio 设置的某个用户发送身份验证请求时,但我一直收到错误未经授权

  4. 我相信我可以通过 postman 调用来访问 Node 应用程序,因为我能够使用 Apache Studio 中存在的用户名和密码获得“未经授权”响应。但是 Node 应用程序无法与 Apache Directory Studio 设置的 Ldap 服务器一起使用/连接,因为我可以将 Node 代码中的服务器字段更改为与 ldap 服务器完全不同,但仍然能够在 postman 中获得未经授权的响应。我可能对 ldap 服务器没有完全了解,也许 Node 应用程序和 ldap 服务器是完全独立的?或者这应该可以工作,只是我的代码有问题?

下面是我最近的代码:

var express      = require('express'),
passport = require('passport'),
bodyParser = require('body-parser'),
LdapStrategy = require('passport-ldapauth'),
basicAuth = require('basic-auth')

var OPTS = {
server: {
url: 'ldap://localhost:389',
bindDN: 'cn=admin,ou=users,dc=contoso,dc=com',
bindCredentials: 'P@ss1W0Rd!',
searchBase: 'ou=users,dc=contoso,dc=com',
searchFilter: '(uid={{Username}})'
},
credentialsLookup: basicAuth
// ,
// usernameField: user,
// passwordField: pass
};

var app = express();

passport.use(new LdapStrategy(OPTS));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(passport.initialize());

app.post('/login', passport.authenticate('ldapauth', {session: false}), function(req, res) {
res.send({status: 'ok'});
});

app.listen(8080);


这是我一直在尝试验证的用户:


dn: cn=Aaron Painter,ou=users,dc=contoso,dc=com
objectClass: top
objectClass: posixAccount
objectClass: organizationalPerson
objectClass: person
objectClass: inetOrgPerson
cn: Aaron Painter
gidNumber: 70051
homeDirectory: /home/aaronp
sn: Painter
uid: aaronp
uidNumber: 70050
displayName: Aaron Painter
givenName: Aaron
mail: aaronp@contoso.com
manager: cn=Christine Koch,ou=users,dc=contoso,dc=com
telephoneNumber: (212) 555-8335
title: Strategy Consulting Manager
userPassword: AAA

这是我使用的 postman 调用: postman call

这是服务器中显示的日志:

contosoOpenLdap | 5d9b8107 conn=1062 fd=19 ACCEPT from IP=172.17.0.1:47712 (IP=0.0.0.0:389)
contosoOpenLdap | 5d9b8107 conn=1063 fd=20 ACCEPT from IP=172.17.0.1:47714 (IP=0.0.0.0:389)
contosoOpenLdap | 5d9b8107 conn=1063 op=0 BIND dn="cn=admin,ou=users,dc=contoso,dc=com" method=128
contosoOpenLdap | 5d9b8107 conn=1063 op=0 RESULT tag=97 err=49 text=
contosoOpenLdap | 5d9b8107 conn=1063 op=1 UNBIND
contosoOpenLdap | 5d9b8107 conn=1063 fd=20 closed

错误代码 49 表示 DN 或密码不正确。但配置对我来说似乎是正确的。

请帮忙谢谢。

最佳答案

有 3 件事需要修复(前提是您的凭据正确):

  • 搜索过滤器语法错误,您不应在其中传递密码
  • 使用 searchBase 的完整 DN(不是 rdn)
  • 您可以通过credentialsLookup从请求中获取凭据,也可以设置usernameFieldpasswordField

例如,使用正确的语法保持相同的用户名属性和搜索库:

searchBase: 'ou=users,dc=contoso,dc=com',
searchFilter: '(cn={{Username}})'

这应该适用于使用以下 dn 模式对用户进行身份验证:

cn=<username>,<searchBase>  =>  cn=foo,ou=users,dc=contoso,dc=com

以上内容基于您之前的配置,但在没有进一步详细信息的情况下,人们仍然无法猜测用户 dn 在您的目录中的样子。请注意,经理帐户 (bindDN) 和普通用户通常不共享相同的 dn 模式/结构,并且过滤器中的用户名属性 cn 可能是错误的。

也就是说,根据用户条目 dn 字符串确定 dn 结构是非常明显的,例如,如果用户名属性是 uid 并且用户库位于 ou=people 下:

dn: uid=foo,ou=people,dc=contoso,dc=com
=> searchBase: 'ou=people,dc=contoso,dc=com'
=> searchFilter: '(uid={{Username}})'

现在,如果您决定通过请求正文传递凭据,则应根据以下内容设置 usernameFieldpasswordField:使用以下正文 { "user": "test", "pass": "test"},您可以设置:

    //credentialsLookup: basicAuth,
usernameField: user,
passwordField: pass

但是,如果您希望通过授权 header 设置凭据,则可以将 credentialsLookup 与所需的身份验证类型结合使用,并在 Postman 的授权选项卡中进行设置。

请注意,如果您同时设置了 credentialsLookup 和其他两个字段,则即使查找失败,credentialsLookup 也会胜出(无法回退)。

关于node.js - 在 Node.js 上使用 Passport-ldapauth 的 LDAP 身份验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58221663/

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