【问题标题】:Can you get a Windows (AD) username in PHP?你能在 PHP 中获得一个 Windows (AD) 用户名​​吗?
【发布时间】:2008-10-03 19:53:12
【问题描述】:

我在 Intranet 上有一个 PHP Web 应用程序,它可以提取该页面上当前用户的 IP 和主机名,但我想知道是否还有一种方法可以获取/提取他们的 Active Directory/Windows 用户名。这可能吗?

【问题讨论】:

    标签: php windows authentication


    【解决方案1】:

    检查AUTH_USER 请求变量。如果您的 Web 应用程序允许匿名访问,这将为空,但如果您的服务器使用基本或 Windows 集成身份验证,它将包含经过身份验证的用户的用户名。

    在 Active Directory 域中,如果您的客户端正在运行 Internet Explorer,并且您的 Web 服务器/文件系统权限配置正确,则 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 一起工作。
    【解决方案2】:

    我在 IIS 上运行了 php mysql - 我可以使用 $_SERVER["AUTH_USER"] if 我在 IIS 中打开 Windows 身份验证 -> 身份验证并关闭匿名身份验证(重要)

    我用它来获取我的用户和域:

    $user = $_SERVER['AUTH_USER'];
    

    $user 将在我们的网络上返回一个类似于:DOMAIN\username 的值,然后只需从字符串中删除 DOMAIN\

    到目前为止,这已在 IE、FF、Chrome、Safari(已测试)中运行。

    【讨论】:

    • 我在 IIS 上运行了 php,并且仅为该站点启用了 Windows 身份验证。我没有这个信息。我可以重新检查什么?
    • 在 IIS 中打开 Windows 身份验证 -> 身份验证并关闭匿名身份验证后,它对我有用。谢谢,干杯!
    • 谢谢你!还有什么东西可以提取与 Win AUTH ID 相关的信息吗?名字、姓氏等
    【解决方案3】:

    查看 PHP LDAP 库函数:http://us.php.net/ldap

    Active Directory [大部分] 符合 LDAP 标准。

    【讨论】:

      【解决方案4】:

      我们的环境中有多个域,所以我使用 preg_replace 和正则表达式来获取没有 DOMAIN\ 的用户名。

      preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
      

      【讨论】:

        【解决方案5】:

        如果您在 Windows 上使用 Apache,您可以从

        安装 mod_auth_sspi

        https://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 中也可以进行单点登录...

        -克雷格

        【讨论】:

        • 嗨!如果您在 Ubuntu 上使用 Apache,但仍想加载 Windows (AD) 用户名​​怎么办?
        【解决方案6】:

        您可以通过要求对某些文件进行身份验证访问来实现 authenticate the user in Apachemod_auth_kerb ... 我认为这样,用户名也应该在 PHP 环境变量中的某个地方可用... 可能最好检查一次 <?php phpinfo(); ?>你让它运行。

        【讨论】:

          【解决方案7】:

          如果您要检索远程用户 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/

          【讨论】:

            【解决方案8】:

            使用此代码:

            shell_exec("wmic computersystem get username")
            

            【讨论】:

            • 这个答案在这个阶段比另一个更好,因为它有助于查看连接到计算机的用户名。
            【解决方案9】:

            查看已修补的 Apache 的 NTLM 身份验证模块 https://github.com/rsim/mod_ntlm

            基于 Apache/Unix 的 NTLM 身份验证模块 http://modntlm.sourceforge.net/

            阅读更多http://blog.rayapps.com/

            来源:http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php

            【讨论】:

              【解决方案10】:

              你可以说getenv('USERNAME')

              【讨论】:

              • 但是你需要安装一个Apache模块来使用这个功能。 apt-get install libapache2-authenntlm-perl
              • 这只会给你计算机名。
              • 这不会让你得到另一端的人的用户名,它会得到你运行 Apache 2 进程的用户的用户名
              【解决方案11】:

              没有。但是您可以做的是让您的 Active Directory 管理员启用 LDAP,以便用户可以维护一组凭据

              http://us2.php.net/ldap

              【讨论】:

              • 您不必启用 LDAP,因为它是 Active Directory 的核心组件。
              【解决方案12】:

              get_user_name 与 getenv('USERNAME'); 的工作方式相同

              我在使用 getenv('USERNAME') 时遇到了编码(西里尔文)问题

              【讨论】:

                【解决方案13】:

                引用还试图确定 AUTH_USER 是否属于特定域组;一个聪明的方法是不要创建一个带有文本文件的锁定文件夹(可以是空白的)。将安全设置为仅具有您要验证的安全/发行版组。一旦你运行 @file_get_contents (

                【讨论】:

                  【解决方案14】:

                  这是一个简单的 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>
                  

                  如果你需要这个模块,这个链接很有用:

                  https://www.apachehaus.net/modules/mod_authnz_sspi/

                  【讨论】:

                    【解决方案15】:

                    试试这个代码:

                    $user= shell_exec("echo %username%"); 
                        echo "user : $user";
                    

                    你在 php 中获得你的 windows(AD) 用户名​​

                    【讨论】:

                    • 这只会给你计算机名
                    【解决方案16】:

                    我尝试了几乎所有这些建议,但它们都返回空值。如果其他人有这个问题,我在 php.net (http://php.net/manual/en/function.get-current-user.php) 上找到了这个方便的功能:

                    get_current_user();
                    $username = get_current_user();
                    echo $username;
                    

                    这是我最终能够获得用户的活动目录用户名的唯一方法。如果以上答案均无效,请尝试一下。

                    【讨论】:

                    • 我认为,通过这种方式,您可以获得在服务器上运行 PHP 的用户,而不是登录到他的机器并从 Web 浏览器向您的 PHP 页面发送请求的用户。在这种情况下,您可能会遇到严重的安全漏洞,因为您的 PHP 页面是作为具有不同权限的完全不同的用户运行的。
                    • @JustAMartin 在过去的几个月里我一直在测试这个,我一直在让登录机器的用户访问我的 PHP 生成的网站——而不是相反。
                    猜你喜欢
                    • 2021-05-12
                    • 2011-01-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-19
                    • 2010-11-15
                    • 2022-11-12
                    相关资源
                    最近更新 更多