首页 > 解决方案 > 从 Active Directory 获取用户信息(组、全名)

问题描述

当用户打开我的 Web 应用程序 (JavaScript/React) 时,他们应该在页面上看到他们的全名(例如 Makarov Viktor (locadm))以及他们从 Active Directory 参与的组列表。Web 服务器和用户都在使用 Active Directory 的同一个企业本地域中。并且用户在打开应用程序时已登录 Active Directory(进入窗口时)。Web 服务器是 Node.js Express 应用程序(代码附在下面)。

不仅如此,我希望用户不要在应用程序中输入登录名和密码,以便它使用单点登录工作。

这是我的第一个 Web 应用程序和 Node.js 服务器应用程序。根据我目前所能找到的信息,我认为,在接受用户的第一个请求时,主要工作应该在服务器端完成。服务器必须识别用户并从 Active Directory 中获取他们的组和全名。然后,Web 应用程序应该以 JSON 对象的形式从服务器获取此信息,并将其显示给页面上的用户。实际上,最终的任务不仅仅是向用户列出组(这是为了简单起见)。我需要知道用户组以将它们作为过滤器包含在对 ElasticSearch 的 API 请求中。

不幸的是,到目前为止我找不到合适的指导。我的另一个猜测是我应该使用 NPMntlmactivedirectory模块,但阅读他们的文档对我没有好处。

const express = require('express'); // импортируем модуль express
//const http = require('http');
const https = require( 'https' );  // для организации https
const compression = require('compression');
const helmet = require('helmet');
const fs = require( 'fs' );   // для чтения ключевых файлов
const morgan = require('morgan'); // для логированиз апросов и ошибок
const vhost = require('vhost'); // для переадресации с имени search.aorti.ru
const path = require('path');
const rfs = require('rotating-file-stream'); // version 2.x
const ntlm = require('express-ntlm');


//задаем путь к https сертификату и ключу
httpsOptions = {
    key: fs.readFileSync("D:\\RTISearch\\Node_https_server\\cert\\sr-rti-sql-12.key"), // путь к ключу
    cert: fs.readFileSync("D:\\RTISearch\\Node_https_server\\cert\\sr-rti-sql-12.crt") // путь к сертификату
}

//задаем hostname  и порт
const hostname = 'hostname.ru';
const port = 443;
const message = `Сервер работает по адресу https://${hostname}:${port}`;

//задаем путь к каталогу с продуктовой версией веб приложения 
const filesDir = 'D:/RTISearch/search_react_app/build'

//Задаем настройки файла для логирования
var accessLogStream = rfs.createStream('access.log', {
  interval: '1M', // rotate monthly
  path: path.join(__dirname, 'logs')
});

//создаем новый инстанс приложения экспресс
const app = express();

//используется для сжатие файлов, отдаваемых с сервера
app.use(compression());
//app.use(ntlm());

//Настраивам с помощью Helmet Content Security Policy
app.use(
  helmet.contentSecurityPolicy({
    directives: {
        defaultSrc: ["'self'"],
        baseUri:["'self'"],
        fontSrc: ["'self'", "https:"," data:"],
        frameAncestors: ["'self'"],
        imgSrc: ["'self'", "data:"],
        scriptSrcAttr: ["'none'"],
        styleSrc: ["'self'", "https:", "'unsafe-inline'"],
        connectSrc: ["'self'","https://sr-rti-sql-12.aorti.ru:9200/rti_search_file_folder/_msearch", "search.aorti.ru"],
        scriptSrc: ["'self'"],
        objectSrc: ["'none'"],
        upgradeInsecureRequests: [],
        blockAllMixedContent: []
      },
    })
);
app.disable('x-powered-by');

//Настраиваем логирование входящих запросов с помощью Morgan
app.use(morgan(':remote-addr - :remote-user - [:date[iso]] - :method - :status - :response-time ms - :total-time[2] - :url - :res[content-length] - :url - :user-agent', { stream: accessLogStream }));

//создаем https сервер
const server = https.createServer(httpsOptions, app);

//подключаем папку с веб приложением
app.use(express.static(filesDir));

app.use((req,res,next)=>{

res.statusCode = 200;
res.setHeader('Content-Type','text/html; charset=utf-8');
res.end('<html><body><h1>Cервер Экспресс работает</h1></body></html>')
});

server.listen(port, () => {
    console.log(message)
    console.log("NODE_ENV = ",process.env.NODE_ENV)
})

标签: javascriptnode.jsactive-directoryuserinfo

解决方案


推荐阅读