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

30

我略知道在加入域的计算机上,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/

我希望能够让我的用户只需指向应用程序,就能自动通过身份验证。有没有人有这方面的经验或已经实现了这个功能呢?

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

我仍然不理解(并希望得到教育)为什么需要HTTP服务器插件,而我们不能拥有一个PHP、Web服务器通用的解决方案。


这是一个内部防火墙应用程序吗? - Bob Aman
1
有什么其他的东西我可以加入以改善这个问题吗? - reconbot
5个回答

18
你只需要使用Apache模块mod_auth_sspi即可。
示例配置:
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

请不要忘记,您也可以在Windows域中使用Firefox进行透明SSO:只需打开about:config,搜索network.automatic-ntlm-auth.trusted-uris,输入您内部应用程序的主机名或FQDN(例如myserver或myserver.corp.domain.com)。您可以有多个条目,并用逗号分隔。请注意保留HTML标签。

2
这个可以运行,你得到了赏金,而我却被困在apache里。其他一些可能也可以工作,但仍然没有不需要apache或iis的东西。我希望有一天能够重新解决这个问题。 - reconbot

1

我曾经遇到过类似的问题,需要为我的组织解决。

我正在研究使用adLDAP

该网站上有一些文档介绍如何实现与Active Directory的无缝认证。


1
相关文档的链接为http://adldap.sourceforge.net/wiki/doku.php?id=seamless_authentication 我会查一下。 - reconbot
1
有一些关于使用令牌重定向到IIS服务器进行身份验证的好信息,但它主要推荐在Linux上使用Apache模块。 - reconbot

1

我对使用OpenID作为后端解决方案很感兴趣... 当我快速搜索时,没有看到任何直接连接到ActiveDirectory的东西。然而,通过普通的HTTP(S)实现可能非常简单(您将成为一个检查本地AD凭据的OpenID提供者)。在最理想的情况下,您可能只需向应用程序添加几个类即可运行 - 无需Web服务器模块。有很多开源代码可以用于此,因此即使没有其他好处,也值得一看。如果向用户公开后端(即提供OpenID URL),则还可以使他们能够使用这些凭据登录到更多不仅是您内部站点的网站。 (例如:Stack Overflow。)

顺便说一下,我反对将它设为必须使用Internet Explorer。从你提问的方式来看,我不确定这是否是目标,但根据你的IT环境,我预计使用Firefox、Safari(或Opera等)的人会不太热衷。(你不是首先针对IE进行开发吧?每当我这样做时,都感到非常痛苦。)这并不是说你不能使用IE的这个功能,只是说它不应该是唯一的选择。你发布的链接说明NTLM适用于更多浏览器,但由于我没有任何经验,很难判断它的效果如何。

所有浏览器都支持NTLM身份验证。IE不再是必需品。 - Kevin Peno

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在我的允许用户数据库中。

一定要在非特权帐户下测试。当我第一次安装它并测试时,它运行良好,但稍后当一个标准的非服务器管理员用户尝试时,它失败了。结果发现一些临时目录需要更改来宾用户的权限。我无法回忆起确切的设置。


0

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