【发布时间】:2008-10-03 19:53:12
【问题描述】:
我在 Intranet 上有一个 PHP Web 应用程序,它可以提取该页面上当前用户的 IP 和主机名,但我想知道是否还有一种方法可以获取/提取他们的 Active Directory/Windows 用户名。这可能吗?
【问题讨论】:
标签: php windows authentication
我在 Intranet 上有一个 PHP Web 应用程序,它可以提取该页面上当前用户的 IP 和主机名,但我想知道是否还有一种方法可以获取/提取他们的 Active Directory/Windows 用户名。这可能吗?
【问题讨论】:
标签: php windows authentication
检查AUTH_USER 请求变量。如果您的 Web 应用程序允许匿名访问,这将为空,但如果您的服务器使用基本或 Windows 集成身份验证,它将包含经过身份验证的用户的用户名。
在 Active Directory 域中,如果您的客户端正在运行 Internet Explorer,并且您的 Web 服务器/文件系统权限配置正确,则 IE 会静默地将其域凭据提交到您的服务器,AUTH_USER 将是 MYDOMAIN\user.name,而用户没有显式登录到您的网络应用程序。
【讨论】:
我在 IIS 上运行了 php mysql - 我可以使用 $_SERVER["AUTH_USER"] if 我在 IIS 中打开 Windows 身份验证 -> 身份验证并关闭匿名身份验证(重要)
我用它来获取我的用户和域:
$user = $_SERVER['AUTH_USER'];
$user 将在我们的网络上返回一个类似于:DOMAIN\username 的值,然后只需从字符串中删除 DOMAIN\。
到目前为止,这已在 IE、FF、Chrome、Safari(已测试)中运行。
【讨论】:
查看 PHP LDAP 库函数:http://us.php.net/ldap。
Active Directory [大部分] 符合 LDAP 标准。
【讨论】:
我们的环境中有多个域,所以我使用 preg_replace 和正则表达式来获取没有 DOMAIN\ 的用户名。
preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
【讨论】:
如果您在 Windows 上使用 Apache,您可以从
安装 mod_auth_sspihttps://sourceforge.net/projects/mod-auth-sspi/
说明在INSTALL 文件中,并且有一个whoami.php 示例。 (只是将mod_auth_sspi.so文件复制到一个文件夹中,并在httpd.conf中添加一行。)
一旦安装并在 httpd.conf 中进行必要的设置以保护您希望的目录,PHP 将使用 IE 中经过身份验证的用户的用户和域 ('USER\DOMAIN') 填充 $_SERVER['REMOTE_USER'] --或者在传入之前在 Firefox 中提示和验证。
信息是基于会话的,因此即使在 Firefox 中也可以进行单点登录...
-克雷格
【讨论】:
您可以通过要求对某些文件进行身份验证访问来实现 authenticate the user in Apache 和 mod_auth_kerb ... 我认为这样,用户名也应该在 PHP 环境变量中的某个地方可用... 可能最好检查一次 <?php phpinfo(); ?>你让它运行。
【讨论】:
如果您要检索远程用户 IDSID/用户名,请使用:
echo gethostbyaddr($_SERVER['REMOTE_ADDR']);
你会得到类似的东西 iamuser1-mys.corp.company.com
过滤后面的其余域,您只能获取 idsid。
欲了解更多信息,请访问http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/
【讨论】:
使用此代码:
shell_exec("wmic computersystem get username")
【讨论】:
查看已修补的 Apache 的 NTLM 身份验证模块 https://github.com/rsim/mod_ntlm
基于 Apache/Unix 的 NTLM 身份验证模块 http://modntlm.sourceforge.net/
来源:http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php
【讨论】:
你可以说getenv('USERNAME')
【讨论】:
apt-get install libapache2-authenntlm-perl
没有。但是您可以做的是让您的 Active Directory 管理员启用 LDAP,以便用户可以维护一组凭据
【讨论】:
get_user_name 与 getenv('USERNAME'); 的工作方式相同
我在使用 getenv('USERNAME') 时遇到了编码(西里尔文)问题
【讨论】:
引用还试图确定 AUTH_USER 是否属于特定域组;一个聪明的方法是不要创建一个带有文本文件的锁定文件夹(可以是空白的)。将安全设置为仅具有您要验证的安全/发行版组。一旦你运行 @file_get_contents (
【讨论】:
这是一个简单的 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";
你在 php 中获得你的 windows(AD) 用户名
【讨论】:
我尝试了几乎所有这些建议,但它们都返回空值。如果其他人有这个问题,我在 php.net (http://php.net/manual/en/function.get-current-user.php) 上找到了这个方便的功能:
get_current_user();
$username = get_current_user();
echo $username;
这是我最终能够获得用户的活动目录用户名的唯一方法。如果以上答案均无效,请尝试一下。
【讨论】: