[英]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)。 您可以有多个条目,它是一个以逗号分隔的列表。
我很好奇一个使用 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.