使用PHP和Active Directory来进行LDAP身份验证,在使用IE/Firefox时。

6

以下代码检查用户的凭据是否与ldap匹配

<?php
$ldaphost = "ldap.domain.com";
$ldapport = 389;

$ds = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");

if ($ds) 
{
    $username = "johndoe@domain.com";
    $upasswd = "pass";

    $ldapbind = ldap_bind($ds, $username, $upasswd);

    if ($ldapbind) 
        {print "Congratulations! $username is authenticated.";}
    else 
        {print "Access Denied!";}
}
?>

我的用户使用Firefox和IE,我知道他们可以无缝地通过他们的ActiveDirectory凭据进行身份验证。

我只想检查AD组,看看那个用户名是否在其中,如果是,则显示页面,否则提示输入凭据。

由于我们的用户已经登录到域控制器,我想获取他们的用户名,检查是否在特定组中找到它,然后让他们进入,否则提示用户输入凭据。这怎么可能实现?


那里面有问题吗? - Marc W
2个回答

8

考虑到您使用IIS作为Web服务器,实际上您不需要从PP代码与Active Directory服务器通信即可实现所需的功能。

这里的关键词是集成的Windows身份验证 - 这是djn 寻找的措辞。如果启用了此选项(并拒绝匿名访问),IIS将根据请求资源的Active Directory和NTFS文件系统权限检查提供的凭据。因此,您可以使用简单的NTFS访问控制机制来控制对文件的访问。

如果您的用户使用IE,他们甚至不需要输入凭据,因为这是通过所谓的SPNEGO(简单且受保护的GSSAPI协商机制)及其基础机制KerberosNTLMSSP自动完成的,具体取决于客户端和服务器能够处理什么。
据我所知,Firefox也能够自动向您的服务器传递Windows登录凭据。您只需调整一个配置选项即可启用该功能 - 不知道这个信息在Firefox 3.5.x中是否仍然有效。
如果您在*nix系统上运行Apache,则必须使用一些服务器端模块来处理类似于集成的Windows身份验证系统。可能的选项是(不知道它们是否实际上仍然得到维护或稳定):
  • mod_auth_ntlm_winbind(Windows上Apache的模块,用于与NTLM认证进行交互)
  • mod_auth_kerb(Windows上Apache的模块,用于与Kerberos认证进行交互)
  • mod_ntlm(Windows上Apache的模块,用于与NTLM认证进行交互)

对于Windows上的Apache,还有以下模块:

请注意,这些模块中的大多数似乎非常古老。


1

刚刚在类似的设置上工作:我跳过了所有LDAP的东西,让Web服务器在让客户端进入之前使用AD进行身份验证(抱歉,我不记得这在M$替代宇宙中叫什么了)。

如果客户端到达PHP脚本,他就在AD中,我有他的用户名分别在$_SERVER["AUTH_USER"]$_SERVER["LOGON_USER"]中,否则他永远无法到达脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接