(приложение для внутренней сети) Я использую ReactJS с NodeJS в качестве API на стороне сервера для доступа к различным ресурсам (таким как профиль активного каталога пользователя).Мне нужно интегрироваться с Active Directory, не запрашивая у пользователя учетные данные.
Использование ActiveDirectory для узла (npm i activedirectory) Я могу запросить AD с использованием LDAP для жестко закодированного sAMAccountName, используя код ниже.
ad.findUser(sAMAccountName, function(err, user) {
if (err) {
console.log('ERROR: ' + JSON.stringify(err));
}
if (!user) console.log('User: ' + sAMAccountName + ' not found.');
else {
thisUser = user;
}
});
Но я не могу понять, как подобрать текущий идентификатор пользователя при вызове API.
В этих 2 примерах вместо идентификатора пользователя «Сервер» вместоидентификатор клиента:
const user = process.env;
const user = require('os').userInfo().username;
В .net я обычно делал бы это с
string NTID = HttpContext.Current.User.Identity.Name;
Так есть ли способ в NodeJS, работающем на сервере, получить доступ к идентификатору пользователя клиента?
--------- ОБНОВЛЕНИЕ: -----------
Я пытался реализовать решениениже, используя passport-windowsauth, но не могу заставить его работать.У меня есть файл web.config, настроенный так:
<iisnode watchedFiles="*.js;node_modules\*;routes\*.js;views\*.jade" promoteServerVars="LOGON_USER,AUTH_USER" />
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
Для конфигурации Azure установлено значение:
ЭтоФункция, которую я вызываю, когда нажимаю кнопку для запуска аутентификации:
activeDirectory = () => {
let url = '';
//Default to current user when in dev
if (
window.location.href.indexOf('localhost') > -1
) {
url = 'http://localhost:5000/express-passport';
} else {
url = '/express-passport';
}
axios({
method: "GET",
url: url,
withCredentials: true
})
.then(response => {
console.log("Done: ", response.data);
})
.catch(error => {
console.log("An error occurred - ", error);
});
};
И это код маршрута сервера NodeJs:
const passport = require("passport");
const WindowsStrategy = require("passport-windowsauth");
module.exports = app => {
let thisUser = {};
passport.use(
new WindowsStrategy(
{
ldap: {
url: "ldap://somethingldap.somewhere.com/CN=,DC=,DC=,DC=,DC=",
base: "CN=,DC=,DC=,DC=,DC=",
bindDN: "serviceAccountDetailsHere",
bindCredentials: "masked"
}
},
function(profile, done) {
thisUser = profile;
console.log("Profile:", profile);
}
)
);
app.get(
"/express-passport",
function(req, res, next) {
passport.authenticate("WindowsAuthentication", function(
error,
user,
info
) {
// log everything to console
console.log(error);
console.log(user);
console.log(info);
if (error) {
res.status(401).send(error);
} else if (!user) {
res.status(401).send(info);
} else {
next();
}
res.status(401).send(info);
})(req, res);
},
// function to call once successfully authenticated
function(req, res) {
res.status(200).send("logged in!");
}
);
};
Итак, теперь, когда открывается страница, я нажимаюКнопка, ожидая, что это аутентифицируется.Появляется всплывающее окно с запросом моих учетных данных, которые я ввожу, но всплывающее окно просто исчезает и появляется снова и снова.Я явно делаю что-то неправильно ...