У меня есть веб-приложение PHP в интрасети, которое может извлекать IP-адрес и имя хоста текущего пользователя на этой странице, но мне было интересно, есть ли способ получить / извлечь их имя пользователя Active Directory / Windows. Это возможно?
Проверьте переменную запроса AUTH_USER
. Это будет пустым, если ваше веб-приложение разрешает анонимный доступ, но если ваш сервер использует базовую или встроенную проверку подлинности Windows, он будет содержать имя пользователя аутентифицированного пользователя.
В домене Active Directory, если ваши клиенты работают с Internet Explorer, и ваши разрешения на веб-сервер / файловую систему настроены правильно, IE будет тихо отправлять свои учетные данные домена на ваш сервер, а AUTH_USER
будет MYDOMAIN\user.name
если пользователи не должны явно регистрировать в вашем веб-приложении.
У меня php mysql работает на IIS – я могу использовать $_SERVER["AUTH_USER"]
если я $_SERVER["AUTH_USER"]
проверку подлинности Windows в IIS -> Аутентификация и отключить анонимную аутентификацию (важно)
Я использовал это для получения моего пользователя и домена:
$user = $_SERVER['AUTH_USER'];
$user
вернет значение, например: DOMAIN\username
в нашей сети, а затем это просто случай удаления DOMAIN\
из строки.
Это работало в IE, FF, Chrome, Safari (проверено).
Посмотрите на функции библиотеки PHP LDAP: http://us.php.net/ldap .
Active Directory [в основном] соответствует стандарту LDAP.
Если вы используете Apache в Windows, вы можете установить mod_auth_sspi из
http://www.gknw.at/development/apache/httpd-2.2/win32/modules/mod_auth_sspi-1.0.4-2.2.2.zip
Инструкции находятся в файле INSTALL, и есть пример whoami.php. (Это просто копирование файла mod_auth_sspi.so в папку и добавление строки в httpd.conf.)
После его установки и необходимых настроек в httpd.conf для защиты каталогов, которые вы хотите, PHP заполнит $_SERVER['REMOTE_USER']
пользователем и доменом (USER \ DOMAIN) аутентифицированного пользователя в IE – – либо запросить и подтвердить подлинность в Firefox, прежде чем передавать его.
Информация основана на сеансе, поэтому сингл (ish) signon возможен даже в Firefox …
-Craig
Возможно, вы могли бы аутентифицировать пользователя в Apache с помощью mod_auth_kerb , требуя аутентифицированного доступа к некоторым файлам … Я так думаю, что имя пользователя должно также быть доступно в переменных среды PHP где-то … возможно, лучше всего проверить с помощью <?php phpinfo(); ?>
<?php phpinfo(); ?>
только вы его запустите.
Нет. Но что вы можете сделать, это активировать администратор Active Directory LDAP, чтобы пользователи могли поддерживать один набор учетных данных
Проверьте исправленный модуль аутентификации NTLM для Apache https://github.com/rsim/mod_ntlm
На основе модуля авторизации NTLM для Apache / Unix http://modntlm.sourceforge.net/
Читайте больше на http://blog.rayapps.com/
Источник: http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php
Если вы хотите получить идентификатор / имя пользователя удаленного пользователя, используйте:
echo gethostbyaddr($_SERVER['REMOTE_ADDR']);
Вы получите что-то вроде iamuser1-mys.corp.company.com
Отфильтруйте остальную часть домена позади, и вы можете получить только идентификатор.
Для получения дополнительной информации посетите http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/
Есть несколько дополнительных библиотек PEAR, которые могут облегчить задачу:
get_user_name работает так же, как getenv ('USERNAME');
У меня были проблемы с кодированием (с кириллицей) с использованием getenv ('USERNAME')
Ссылка на попытку также выяснить, является ли AUTH_USER частью определенной группы домена; умный способ сделать это: t создать заблокированную папку с текстовыми файлами (может быть пустым). Установите безопасность только для группы безопасности / группы, которую вы хотите проверить. Когда вы запустите @file_get_contents (<— будет бросать предупреждение) … если у пользователя нет группового доступа, они не смогут получить содержимое файла и, следовательно, не будут иметь доступ к этой конкретной группе AD. Это просто и прекрасно работает.
Вы можете сказать getenv('USERNAME')
У нас есть несколько доменов в нашей среде, поэтому я использую preg_replace с регулярным выражением, чтобы получить только имя пользователя без DOMAIN \.
preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
Это простой пример интеграции 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>
И если вам нужен модуль, эта ссылка полезна:
попробуйте этот код:
$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;
Это был единственный способ, которым я наконец смог получить имя пользователя активного каталога пользователя. Если ни один из вышеперечисленных ответов не сработал, попробуйте.