我们的客户在 Linux(Apache、PHP)上运行内部网。授权由登录对话框、PHP session 提供。
客户要求不要向登录到其域的 Windows 计算机询问密码,而是使用登录用户的用户名/密码。
由于安全原因,与 apache ldpap 的协作超出了范围。
解决方案是在专用计算机上使用 ISS 作为透明代理,重写到运行 Intranet 的 apache linux 服务器,但使用代理将身份验证信息(登录名、密码)传递给 apache 服务器。
这个解决方案可以实现吗?如果是这样,请给我建议。
提前致谢
最佳答案
我假设带有 LDAP 的 Apache 超出范围的原因是用户名/密码由 PHP 应用程序处理。这个假设部分来自登录对话框的使用。
基于此假设,转发密码的代理解决方案存在一些问题,因为您基本上是在两个域之间进行身份验证。在两个域之间同步密码可能是不可行的。您会遇到新用户必须等待同步发生才能访问应用程序的问题。在执行同步之前,密码更改也会导致登录问题。您在获取实际密码时也遇到了问题....
域身份验证的工作方式是,如果初始请求导致质询,Internet Explorer 将专门尝试通过远程站点进行身份验证。这可以是 NTLM、基本身份验证或其他;关键是,凭据交换由 Web 服务器使用 HTTP header 和质询/响应处理。当 Web 应用程序在 IIS 上执行时,Web 服务器已经执行了 LDAP 验证,应用程序只知道用户名但不知道密码。 (在使用 NTLM 的情况下,实际上从未在质询/响应握手中交换密码。客户端通过质询/响应证明它知道正确的密码。)
您能够做到这一点的唯一方法可能是让 IIS 应用程序通过 LDAP 验证用户,然后从 PHP 应用程序中查找该用户的凭据。您如何将 Windows 域用户映射到 PHP 应用程序中的用户可能是通过域\用户名。代替代理,应用程序可以加密用户名/密码,并使用重定向将加密的有效负载作为请求参数传递给应用程序。用户登录,响应通过附加了加密负载作为参数的 URL 将他们重定向到 PHP 应用程序。
加密可以通过 .Net 应用程序和 PHP 应用程序之间的共享 key 来完成。更好的解决方案是使用 PHP 应用程序的 SSL 证书的公钥对其进行加密。这样 key 会定期更改,您不必更新双方的共享 key 。
您可能还想在加密的有效负载中包含时间戳,以确保重定向登录仅在特定时间段内有效。您还必须保持负载较小,以便重定向 URL 不会超过浏览器可以处理的最大大小。
关于linux - IIS 代理到 Apache 并通过域身份验证 howto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6492642/