使用 ldapjs 包通过 Node.js 从 LDAP Active Directory 服务器检索用户信息

问题描述 投票:0回答:1

我正在尝试创建一个函数,使用 Node.js 中的 ldapjs 从 Active Directory 中获取用户的所有详细信息。这是我正在使用的功能:


const ldapConfig = {
    url: 'ldap://your-ldap-server',
    bindDN: 'cn=admin,dc=example,dc=com',
    bindCredentials: 'admin-password',
    searchBase: 'dc=example,dc=com',
    searchOptions: {
        scope: 'sub',
        attributes: ['*'] // Fetch all attributes
    }
};

function searchLDAPByUserPrincipalName(userPrincipalName, callback) {
    const client = ldap.createClient({
        url: ldapConfig.url
    });

    console.log('Connecting to LDAP server...');

    client.bind(ldapConfig.bindDN, ldapConfig.bindCredentials, (err) => {
        if (err) {
            console.error('Bind error:', err);
            return callback(err);
        }

        console.log('Bind successful');

        const opts = {
            ...ldapConfig.searchOptions,
            filter: `(&(objectClass=person)(userPrincipalName=${userPrincipalName}))`
        };

        client.search(ldapConfig.searchBase, opts, (err, res) => {
            if (err) {
                console.error('Search error:', err);
                client.unbind();
                return callback(err);
            }

            let user = null;

            res.on('searchEntry', (entry) => {
                console.log('Entry found:', JSON.stringify(entry.object, null, 2));
                user = entry.object;
            });

            res.on('searchReference', (referral) => {
                console.log('Referral:', referral.uris.join());
            });

            res.on('error', (err) => {
                console.error('Search entry error:', err);
                client.unbind();
                return callback(err);
            });

            res.on('end', (result) => {
                console.log('Search end status:', result.status);
                client.unbind();
                if (result.status !== 0) {
                    return callback(new Error(`Non-zero status from LDAP search: ${result.status}`));
                }
                callback(null, user);
            });
        });
    });
}

// Example usage
searchLDAPByUserPrincipalName('[email protected]', (err, user) => {
    if (err) {
        console.error('LDAP search failed:', err);
    } else {
        console.log('User found:', user);
    }
});```

当我运行此代码时,我希望在日志中看到用户详细信息。但是,我得到以下日志输出:

my-form\src> node server.js
Connecting to LDAP server...
Bind successful
Entry found: undefined
Search end status: 0
User found: undefined

我可以看到 LDAP 连接和绑定成功,并且搜索选项看起来正确。但是,找到的条目和找到的用户日志显示未定义

到目前为止我尝试过的:

仔细检查 ldapConfig 值以确保它们正确。 已验证正在搜索的 userPrincipalName 是否存在于目录中。 记录搜索选项以确认它们包含正确的过滤器和属性。 尽管执行了这些步骤,仍然无法获取用户信息。谁能帮助我理解为什么用户返回未定义以及如何修复它?

javascript node.js ldap ldapjs
1个回答
0
投票

我用这个解决了我的问题:

    let parsed = {};
    if (entry.object) {
        parsed = entry.object;
    } else if (entry.attributes) {
        entry.attributes.forEach(attr => {
            parsed[attr.type] = attr.vals;
        });
    }
    return parsed;
}
© www.soinside.com 2019 - 2024. All rights reserved.