node.js - 使用 NodeJS 进行 Active Directory 身份验证
问题描述
我正在尝试构建一个 NodeJS 服务器并计划使用该组织的 Microsoft Active Directory 进行身份验证。
我对许多软件包(activedirectory、activedirectory2、ldapjs 等)都进行了同样的尝试
但它们似乎都不适合我。
我提供了 LDAP URL,下面是我的代码。
var ldapjs = require('ldapjs');
var config = { url: 'ldap://mycompany.com/dc=mycompany,dc=com'
,timeout: 10
,reconnect: {
"initialDelay": 100,
"maxDelay": 500,
"failAfter": 5
}
}
var username = "user_id@mycompany.com";
var password="password";
const ldapClient = ldapjs.createClient(config);
ldapClient.bind(username, password, function (err) {
console.log("Logging data...");
ldapClient.search('dc=mycompany,dc=com', function (err, search) {
if (err) {
console.log('ERROR: ' +JSON.stringify(err));
return;
}
search.on('searchEntry', function (err,entry) {
if (err) {
console.log('ERROR: ' +JSON.stringify(err));
return;
}
else{
var user = entry.object;
console.log("Done.");
return;
}
});
});
});
有时它有效,但在大多数情况下,我不断收到以下错误(可能是当它选择不同的 IP 时)
Error: connect ETIMEDOUT <ip address>:389
at Object.exports._errnoException (util.js:1018:11)
at exports._exceptionWithHostPort (util.js:1041:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)
令我困惑的是;如果我在我的 C# 应用程序中尝试使用相同的 LDAP URL,它可以正常工作。
.Net 应用程序使用它的方式与 NodeJS 使用的方式有什么不同吗?
我可以以某种方式更改我的代码以使其工作吗?
解决方案
因为这是 Google 搜索结果中弹出的第一个问题,而且我花了很长时间才弄清楚如何使用 Active Directory 身份验证,所以我将分享本教程中的解决方案。
与我在互联网上找到的其他示例相比,它非常容易理解和实现:
npm install --save activedirectory
// Initialize
var ActiveDirectory = require('activedirectory');
var config = {
url: 'ldap://dc.domain.com',
baseDN: 'dc=domain,dc=com'
};
var ad = new ActiveDirectory(config);
var username = 'john.smith@domain.com';
var password = 'password';
// Authenticate
ad.authenticate(username, password, function(err, auth) {
if (err) {
console.log('ERROR: '+JSON.stringify(err));
return;
}
if (auth) {
console.log('Authenticated!');
}
else {
console.log('Authentication failed!');
}
});
最困难的部分是弄清楚用户名使用什么后缀。
我收到了错误:
错误:{“lde_message”:“80090308:LdapErr:DSID-0C090400,注释:AcceptSecurityContext 错误,数据 52e,v1db1\u0000”,“lde_dn”:null}
在最终设置正确的后缀之前,对我来说是这样的:
var username = 'john.smith@foo.companyname.com
推荐阅读
- python - 找出 1000 以下所有 3 或 5 的倍数之和。(我的代码有什么问题)
- sql - 修改要过滤的约束
- r - 过滤具有两个不同标准的个人?
- javascript - 是否为每个滚动事件在变量内存中重新创建?
- github - GitHub API 速率限制是否适用于 GitHub 操作?
- html - 从移动设备切换到停止 html
- node.js - Node.js Mocha 单元测试不改变对象值
- node.js - 使用 api 更改 Twitter 用户名
- r - 使用 lightgbm Tweedie 目标将 SHAP 值从原始单位转换为原生单位?
- microsoft-graph-api - Microsoft Graph API 调用 getOffice365ActiveUserDetail 失败并出现 HTTP 403