如何使用Microsoft AD为内部PHP应用程序实现单点登录(SSO)?

时间:2009-06-16 20:21:45

标签: php active-directory apache2 nginx single-sign-on

我隐约意识到,在加入域的计算机上,可以要求IE发送一些额外的标题,我可以用它来自动登录到应用程序。我用mod_php在windows服务器上运行apache。我希望能够避免用户必要时登录。我发现了一些关于Kerberos和Apache模块的链接。

http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html?page=last https://metacpan.org/pod/Apache2::AuthenNTLM

由于我在Windows上运行,因此证明安装Perl或Apache模块并非易事。但PHP不能访问HTTP头吗?

我发现了这个,但它没有进行任何身份验证,只是表明PHP可以读取NTLM头文件。 http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

我希望能够让我的用户只指向该应用程序并让它们自动进行身份验证。有没有人对此有任何经验或者让它完全工作?

更新 自从发布这个问题以来,我们已经将设置更改为仍然在Windows上运行的nginx和php-fcgi。 Windows上的Apache2和php-cgi可能是您在Windows上配置的最慢设置之一。它看起来可能仍然需要Apache(它适用于php-fcgi)但我更喜欢nginx解决方案。

我仍然不理解(并希望接受教育)为什么HTTP服务器插件是必要的,我们不能拥有PHP,Web服务器无关的解决方案。

5 个答案:

答案 0 :(得分:18)

您需要的只是mod_auth_sspi Apache模块。

示例配置:

AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIDomain mydomain

# Set this if you want to allow access with clients that do not support NTLM, or via proxy from outside. Don't forget to require SSL in this case!
SSPIOfferBasic On

# Set this if you have only one domain and don't want the MYDOMAIN\ prefix on each user name
SSPIOmitDomain On

# AD user names are case-insensitive, so use this for normalization if your application's user names are case-sensitive
SSPIUsernameCase Lower
AuthName "Some text to prompt for domain credentials"
Require valid-user

并且不要忘记您也可以use Firefox for transparent SSO in a Windows domain:只需转到about:config,搜索network.automatic-ntlm-auth.trusted-uris,然后输入内部应用程序的主机名或FQDN(如myserver或myserver.corp.domain.com)。您可以有多个条目,它是以逗号分隔的列表。

答案 1 :(得分:1)

我遇到了类似的问题,我需要为我的组织解决这个问题。

我正在研究使用adLDAP

网站上有一些文档可用于使用Active Directory实现无缝身份验证。

答案 2 :(得分:1)

我对使用OpenID作为后端(各种各样)的解决方案感到好奇......当我用google搜索(快速)时,我没有看到任何会直接挂钩到ActiveDirectory的内容。但是,通过普通的HTTP(S)实现它可能非常轻松(您将成为检查本地AD凭据的OpenID提供程序)。在最佳情况下,您可能只需向应用程序添加几个类,即可关闭并运行 - 无需Web服务器模块。对于这方面的任何一方都有很多开源代码,所以如果没有别的,那么值得一看。如果您将后端暴露给用户(即为他们提供了OpenID URL),您将获得额外的好处,即他们能够使用这些凭据登录到不仅仅是您的内部站点。 (示例:Stack Overflow。)

顺便说一句,我反对制作它以便需要Internet Explorer。我不确定这是否是您编写问题的方式的目标,但根据您的IT环境,我希望使用Firefox或Safari(或Opera或......)的人不那么热情。 (你不是首先针对IE开发,不是吗?每当我这样做的时候都很痛苦。)这并不是说你不能使用IE的这个功能,只是它不应该是唯一的选择。您发布的链接表明NTLM的工作比IE更多,但由于我没有任何使用经验,因此很难判断它的效果如何。

答案 3 :(得分:0)

您可以选择使用CAS(中央身份验证服务)。

它有php客户端库。

如何链接到MS Active Directory:http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

你需要Apache maven 2。

答案 4 :(得分:0)

对于IIS / PHP FCGI,您需要发送未经授权的标头:

function EnableAuthentication()
{
    $realm = "yoursite";
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
    header("HTTP/1.1 401 Unauthorized"); 
    exit;
}

然后您可以使用以下命令获取用户名:

$winuser = $_SERVER["REMOTE_USER"];

然后我确保$ winuser在我的允许用户数据库中。

确保在非特权帐户下进行测试。当我第一次安装它时,我测试了它并且工作正常,但是后来当标准的非服务器管理员用户尝试它时失败了。事实证明,一些临时目录需要为访客用户更改权限。我不记得确切的设置。