基于PHP实现带自定义登录表单的ADFS SSO及AD用户验证
实现方案:PHP集成Active Directory用户验证并返回用户信息
核心流程
- 自有应用登录页收集用户邮箱与密码
- PHP后端对接Active Directory完成身份校验
- 校验通过后提取用户邮箱等信息返回至前端
- 适配AWS服务器环境确保依赖正常
具体代码实现
1. 登录前端表单示例
<form method="post" action="ad-auth.php"> <label>邮箱:</label> <input type="email" name="email" required> <label>密码:</label> <input type="password" name="password" required> <button type="submit">登录</button> </form>
2. PHP后端AD验证逻辑
依赖PHP的ldap扩展(需在AWS服务器上启用),以下为核心验证与信息查询代码:
<?php // 生产环境建议关闭错误输出,改用日志记录 error_reporting(0); // AD配置(根据实际环境修改) $adServer = 'ldap://你的AD服务器IP或域名'; $adDomain = '你的域名称.com'; $adBaseDn = 'DC=你的域名称,DC=com'; // 获取表单提交数据 $email = $_POST['email'] ?? ''; $password = $_POST['password'] ?? ''; // 从邮箱提取AD用户名(假设邮箱格式为user@domain.com) $username = explode('@', $email)[0]; $fullAdUsername = $username . '@' . $adDomain; // 初始化LDAP连接 $ldapConn = ldap_connect($adServer); if (!$ldapConn) { echo json_encode(['status' => 'error', 'message' => '无法连接AD服务器']); exit; } // 设置LDAP协议选项 ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0); // 尝试绑定AD用户进行验证 $bindSuccess = ldap_bind($ldapConn, $fullAdUsername, $password); if (!$bindSuccess) { echo json_encode(['status' => 'error', 'message' => '邮箱或密码错误']); ldap_close($ldapConn); exit; } // 验证通过后查询用户详细信息 $searchFilter = "(mail=$email)"; $targetAttributes = ['mail', 'displayName', 'samaccountname']; // 按需指定返回字段 $searchResult = ldap_search($ldapConn, $adBaseDn, $searchFilter, $targetAttributes); $userEntries = ldap_get_entries($ldapConn, $searchResult); if ($userEntries['count'] === 0) { echo json_encode(['status' => 'error', 'message' => '未找到用户信息']); } else { $userInfo = [ 'status' => 'success', 'email' => $userEntries[0]['mail'][0], 'display_name' => $userEntries[0]['displayname'][0] ?? '', 'username' => $userEntries[0]['samaccountname'][0] ?? '' ]; echo json_encode($userInfo); } // 关闭LDAP连接 ldap_close($ldapConn); ?>
AWS服务器环境配置要点
- 启用PHP的ldap扩展:
- Ubuntu/Debian系统:执行
sudo apt-get install php-ldap后重启Apache/Nginx - CentOS/RHEL系统:执行
sudo yum install php-ldap后重启服务
- Ubuntu/Debian系统:执行
- 安全组配置:开放AWS服务器到AD服务器的LDAP端口(默认389,加密端口636)
- 共享XML配置(若两台服务器需统一配置):将AD参数写入XML文件,PHP读取使用:
// 读取XML配置示例 $configXml = simplexml_load_file('/服务器路径/ad-config.xml'); $adServer = (string)$configXml->server; $adDomain = (string)$configXml->domain; $adBaseDn = (string)$configXml->baseDn;
生产环境注意事项
- 强制使用HTTPS传输,避免密码明文泄露
- 禁止硬编码AD配置,改用环境变量或加密配置文件存储
- 完善错误日志记录,便于排查问题
- 若AD启用SSL,使用
ldaps://协议与636端口,并配置对应证书
内容的提问来源于stack exchange,提问作者Farhan Haider
相关产品推荐
相关产品推荐

