You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux/XAMPP环境下的PHP中免密码从Active Directory获取用户名?

PHP在Linux/XAMPP环境下获取AD用户名并存储的可行方案

方案一:纯PHP实现NTLMv2认证(无需服务器模块)

这种方式依赖客户端已登录AD域,浏览器会自动发送NTLM凭证,不用用户手动输入账号密码,也不会明文传输密码。

  • 流程:
    1. 检查请求头是否携带Authorization,没有就返回401并触发NTLM认证请求。
    2. 解析客户端返回的NTLM响应,提取出用户名。
    3. 可选:通过LDAP查询验证用户名的有效性,之后将用户名存入变量。
  • 代码示例:
<?php
session_start();

if (!isset($_SERVER['HTTP_AUTHORIZATION'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: NTLM');
    exit;
}

$authHeader = $_SERVER['HTTP_AUTHORIZATION'];
if (str_starts_with($authHeader, 'NTLM ')) {
    $ntlmMsg = base64_decode(substr($authHeader, 5));
    
    // 处理NTLM第一步,返回挑战
    if (strlen($ntlmMsg) == 8) {
        $challenge = $ntlmMsg . str_repeat("\0", 24);
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: NTLM ' . base64_encode($challenge));
        exit;
    }
    
    // 解析NTLM响应获取用户名
    $usernameStart = 32;
    $usernameEnd = strpos($ntlmMsg, "\0", $usernameStart);
    $username = mb_convert_encoding(substr($ntlmMsg, $usernameStart, $usernameEnd - $usernameStart), 'UTF-8', 'UTF-16LE');
    
    // 存储用户名到变量
    $adUser = $username;
    echo "当前认证用户:{$adUser}";
}
?>
  • 注意:需要客户端浏览器支持NTLM(如IE、Chrome在域环境下默认支持),非域环境的客户端可能无法自动触发认证。

方案二:表单+哈希验证(避免明文密码传输)

如果客户端不在域环境,必须手动输入账号,可以通过哈希方式避免密码明文传输:

  • 流程:
    1. 服务器生成随机挑战值,存入Session。
    2. 前端页面让用户输入账号,前端将密码与挑战值拼接后做SHA-256哈希,只传输账号和哈希值到服务器。
    3. 服务器用服务账号绑定LDAP,获取该用户的NTLM哈希,用同样的挑战值计算哈希并对比。
    4. 验证通过后存储用户名。
  • 限制:需要AD允许读取用户的NTLM哈希,或者有服务账号可以完成LDAP绑定验证。

方案三:部署轻量SSO代理服务

如果无法修改PHP环境配置,可以额外部署一个处理NTLM认证的代理服务:

  • 流程:
    1. 在Linux服务器上部署一个简单的代理(比如用Python的ntlm-auth库实现),负责处理NTLM认证逻辑。
    2. PHP应用将请求转发到代理,代理完成认证后返回用户名。
    3. PHP获取用户名并存储到变量。
  • 优势:不需要改动PHP环境的核心配置,代理服务可以独立维护。

内容的提问来源于stack exchange,提问作者Deema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:24:56