У меня есть веб-приложение PHP в интрасети, которое может извлекать IP-адрес и имя хоста текущего пользователя на этой странице, но мне было интересно, есть ли способ получить / извлечь их имя пользователя Active Directory / Windows. Это возможно?






Нет. Но вы можете сделать так, чтобы ваш администратор Active Directory включил LDAP, чтобы пользователи могли поддерживать один набор учетных данных.
Проверьте переменную запроса AUTH_USER. Он будет пустым, если ваше веб-приложение разрешает анонимный доступ, но если ваш сервер использует базовую проверку подлинности или встроенную проверку подлинности Windows, он будет содержать имя пользователя, прошедшего проверку подлинности.
В домене Active Directory, если ваши клиенты работают с Internet Explorer и разрешения вашего веб-сервера / файловой системы настроены правильно, IE будет молча отправить свои учетные данные домена на ваш сервер, а AUTH_USER будет MYDOMAIN\user.name без необходимости явного входа пользователей в вашу сеть. приложение.
только IE передает ваши учетные данные, другие браузеры просто запрашивают, и в этом случае вам просто нужно указать учетные данные своего домена (домен \ имя пользователя и пароль).
Firefox также поддерживает (автоматическую) встроенную аутентификацию. см. developer.mozilla.org/en/Integrated_Authentication
Если мое приложение выполняет разумные операции: могу ли я полностью доверять переданному AUTH_USER? Клиенты являются частью хорошо управляемой корпоративной интрасети. Помимо AUTH_USER, мне нужно знать, принадлежит ли пользователь к определенной группе. Будет ли эта информация передана? И, наконец, есть ли у вас URL-адрес, описывающий вашу информацию?
Спасибо за этот ответ. Не забудьте отключить анонимный доступ в IIS и включить встроенную проверку подлинности Windows. Используя Intraweb, можно получить затем аутентифицированного пользователя с помощью WebApplication.Request.GetFieldByName ('AUTH_USER')
У меня встроенная проверка подлинности Windows, и даже с IE пользователь спрашивает. Я не могу заставить его работать с IIS.
@Simurr это возможно не только с IE, большинство других браузеров поддерживают его, но только в IE он включен для всего Интернета по умолчанию, остальные вы должны включить его вручную, прежде чем вы сможете его использовать, для firefox вы можете использовать это дополнение или вручную выставить конфиг addons.mozilla.org/en-GB/firefox/addon/…
@MikeT, учитывая, что мой комментарий был от '08, вероятно, это было возможно только в IE, хотя я лишь смутно помню, как изучал его. Приятно знать, что сейчас это работает.
Спасибо команде. Но мой случай другой. У меня много приложений, размещенных на одном сервере. Поэтому я хотел получить учетные данные AD с компьютера локального пользователя только для одного приложения. Если я включу аутентификацию AD и отключу анонимный доступ, все другие приложения также будут заполнять учетные данные AD. Поэтому, пожалуйста, подскажите, что я могу сделать только для индивидуального применения.
Посмотрите на функции библиотеки PHP LDAP: http://us.php.net/ldap.
Active Directory [в основном] соответствует стандарту LDAP.
Вероятно, вы могли бы подтвердить подлинностьпользователь в Apache с mod_auth_kerb, требуя аутентифицированного доступа к некоторым файлам ... Я думаю, что таким образом имя пользователя также должно быть доступно где-то в переменных среды PHP ... вероятно, лучше всего проверить <?php phpinfo(); ?>, как только вы его запустите.
Если вы используете Apache в Windows, вы можете установить mod_auth_sspi из
https://sourceforge.net/projects/mod-auth-sspi/
Инструкции находятся в файле INSTALL, и есть пример whoami.php. (Это просто случай копирования файла mod_auth_sspi.so в папку и добавления строки в httpd.conf.)
После установки и выполнения необходимых настроек в httpd.conf для защиты желаемых каталогов PHP заполнит $_SERVER['REMOTE_USER'] пользователем и доменом ('USER \ DOMAIN') аутентифицированного пользователя в IE - или запросит и аутентифицируется в Firefox перед его передачей.
Информация основана на сеансе, поэтому однократный вход в систему возможен даже в Firefox ...
-Крейг
Привет! Что делать, если вы используете Apache в Ubuntu и по-прежнему хотите загрузить имя пользователя Windows (AD)?
Можно сказать getenv('USERNAME')
Но вам необходимо установить модуль Apache, чтобы использовать эту функцию. apt-get install libapache2-authenntlm-perl
Это даст вам только имя компьютера.
Это не даст вам имя пользователя на другом конце, оно даст вам имя пользователя, запустившего процесс Apache 2.
У меня есть php mysql, работающий в IIS - я могу использовать $_SERVER["AUTH_USER"]если Я включаю проверку подлинности Windows в IIS -> Проверка подлинности и выключаю анонимную проверку подлинности (важно)
Я использовал это, чтобы получить своего пользователя и домен:
$user = $_SERVER['AUTH_USER'];
$user вернет значение вроде: DOMAIN\username в нашей сети, и тогда это просто случай удаления DOMAIN\ из строки.
До сих пор это работало в IE, FF, Chrome, Safari (проверено).
У меня php работает на IIS, и для этого сайта включена только проверка подлинности Windows. У меня нет этой информации. Что я мог перепроверить?
После включения проверки подлинности Windows в IIS -> Проверка подлинности и отключения анонимной проверки подлинности это сработало для меня. Спасибо, ура!
Проверьте исправленный модуль аутентификации NTLM для Apache https://github.com/rsim/mod_ntlm
На основе модуля NTLM auth для Apache / Unix http://modntlm.sourceforge.net/
Подробнее на http://blog.rayapps.com/
Источник: http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php
get_user_name работает так же, как getenv ('USERNAME');
У меня были проблемы с кодировкой (кириллицей) с использованием getenv ('USERNAME')
Если вы хотите получить IDSID / имя пользователя удаленного пользователя, используйте:
echo gethostbyaddr($_SERVER['REMOTE_ADDR']);
Вы получите что-то вроде iamuser1-mys.corp.company.com
Отфильтруйте остальную часть домена позади, и вы сможете получить только идентификатор.
Для получения дополнительной информации посетите http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/
Ссылка на попытку выяснить, является ли AUTH_USER частью определенной доменной группы; умный способ сделать это - создать заблокированную папку с текстовыми файлами (может быть пустой). Установите безопасность только на наличие группы безопасности / дистрибутива, которую вы хотите проверить. Как только вы запустите @file_get_contents (<--- выдаст предупреждение) ... если у пользователя нет доступа к группе, он не сможет получить содержимое файла и, следовательно, не будет иметь доступа к этой конкретной группе AD. Это просто и прекрасно работает.
У нас есть несколько доменов в нашей среде, поэтому я использую preg_replace с регулярным выражением, чтобы получить только имя пользователя без DOMAIN \.
preg_replace("/^.+\/", "", $_SERVER["AUTH_USER"]);
попробуйте этот код:
$user= shell_exec("echo %username%");
echo "user : $user";
вы получаете свое имя пользователя Windows (AD) на php
Это даст вам только имя компьютера
Я пробовал почти все эти предложения, но все они возвращали пустые значения. Если у кого-то еще есть эта проблема, я нашел эту удобную функцию на php.net (http://php.net/manual/en/function.get-current-user.php):
get_current_user();
$username = get_current_user();
echo $username;
Это был единственный способ получить имя пользователя активного каталога пользователя. Если ни один из приведенных выше ответов не помог, попробуйте.
Я думаю, таким образом вы получаете пользователя, который запускает ваш PHP на сервере, а не пользователя, который вошел в систему на своей машине и отправляет запрос из веб-браузера на вашу страницу PHP. В этом случае у вас может быть серьезная дыра в безопасности, поскольку ваша страница PHP работает от имени совершенно другого пользователя с разными разрешениями.
@JustAMartin Я тестировал это в течение последних нескольких месяцев, и я постоянно получаю пользователя, который вошел в систему и получает доступ к веб-сайту, созданному моим PHP, а не наоборот.
Это простой пример интеграции NTLM AD, разрешающий единый вход в Internet Explorer, требующий входа / настройки в других браузерах.
Пример PHP
<?php
$user = $_SERVER['REMOTE_USER'];
$domain = getenv('USERDOMAIN');
?>
В вашем файле apache httpd.conf
LoadModule authnz_sspi_module modules/mod_authnz_sspi.so
<Directory "/path/to/folder">
AllowOverride All
Options ExecCGI
AuthName "SSPI Authentication"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIOmitDomain On
Require valid-user
Require user "NT AUTHORITY\ANONYMOUS LOGON" denied
</Directory>
А если вам нужен модуль, пригодится эта ссылка:
Используйте этот код:
shell_exec("wmic computersystem get username")
Вам не нужно включать LDAP, поскольку это основной компонент Active Directory.