繁体   English   中英

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

[英]How can I implement single sign-on (SSO) using Microsoft AD for an internal PHP app?

我隐约意识到在加入域的计算机上,可以要求 IE 发送一些额外的标头,我可以使用这些标头自动登录到应用程序。 我有 apache 在带有 mod_php 的 windows 服务器上运行。 我希望能够避免用户在必要时必须登录。 我发现了一些谈论 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 上运行。Apache2 和 windows 上的 php-cgi 可能是您可以在 8838236010511888 上配置的最慢的设置之一,它可能仍然像 888.8 一样看起来像 888.8需要(它适用于 php-fcgi),但我更喜欢 nginx 解决方案。

我仍然不明白(并且很想接受教育)为什么 HTTP 服务器插件是必需的,我们不能有 PHP、web 服务器不可知的解决方案。

您只需要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

并且不要忘记,您还可以在 Windows 域中使用 Firefox 进行透明 SSO :只需将 go 设置为about:config ,搜索network.automatic-ntlm-auth.trusted-uris ,然后输入您内部网络的主机名或 FQDN应用程序(如 myserver 或 myserver.corp.domain.com)。 您可以有多个条目,它是一个以逗号分隔的列表。

我有一个类似的问题需要为我的组织解决。

我正在研究使用adLDAP

站点上也有一些文档可以实现与 Active Directory 的无缝身份验证。

我很好奇一个使用 OpenID 作为后端(某种)的解决方案......当我用谷歌搜索(快速)时,我没有看到任何可以直接连接到 ActiveDirectory 的东西。 但是,通过纯 HTTP(S) 实现可能非常轻松(您将是一个 OpenID 提供者,根据您的本地 AD 检查凭据)。 在最好的情况下,您可能只需向您的应用程序添加几个类,即可关闭并运行——不需要 web 服务器模块。 这方面的任何一方都有很多开源代码,所以如果不出意外,值得一看。 如果您向用户公开后端(即给他们 OpenID URL),您将获得额外的好处,即他们能够使用这些凭据登录到您的内部站点之外的其他站点。 (例如:堆栈溢出。)

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

您的一种选择是使用 CAS(中央身份验证服务)。

它有 php 客户端库。

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

不过,您需要 Apache maven 2。

对于IIS/PHP FCGI,你需要发出未经授权的header:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM