我可以强制 sqlsrv_connect (PHP) 通过提供的凭据使用 windows 身份验证吗?

Can I force sqlsrv_connect (PHP) to use windows authentication with supplied credentials?

设置:Intranet SQL 服务器和域控制器。在 DMZ 中,我们有一个 Web 服务器(IIS,PHP7)。

SQL 服务器具有混合模式身份验证。我正在尝试从旧的 API 设置(PHP5、mssql_connect)迁移到新的设置(PHP7、IIS)。

使用旧的 API 设置,身份验证通过 mssql_connect 使用提供的用户名和密码进行,并且可以毫无问题地连接到 sql 服务器。用户名和密码是域凭据,并在 SQL 服务器上设置为组。这让 add/remove 用户更容易使用,而且效果很好。

新 API 设置尝试 #1: - sqlsrv_connect:提供用户名和密码强制 sqlsrv_connect 使用 SQL USER 身份验证而不是 WINDOWS 身份验证。因为用户在域中但未直接分配给 SQL 服务器,所以失败。

尝试 #2: - sqlsrv_connect:不提供用户名和密码会强制 sqlsrv_connect 通过 windows 身份验证与设置的凭据(不是我们需要的)进行连接。是的,我们可以将这些凭据设置为我们想要的任何内容,但是 SQL 服务器中检查用户名的任何存储过程可能 return 我们的 'set user',而不是实际的客户端用户名。

尝试 #3: - PDO:sqlsrv: - 有和没有用户名都是一样的。

尝试 #4: - 进行 LDAP 身份验证(使用凭据)然后 sqlsrv_connect(不使用凭据)。这允许我验证用户应该有权访问数据库,但不允许我从存储过程中看到用户名。

我从 google、Whosebug 和其他地方阅读了很多关于这个主题的帖子。 NONE 其中的地址有一个 API 托管在 DMZ 中,您不希望 WEBSERVER 本身拥有可以访问数据库的凭据。我们需要的是将用户提供的凭据作为 "Windows Authentication"(而不是 SQL 用户)通过 API(Web 服务器)传递到 SQL 服务器。这样,对 SQL 服务器的任何查询都是作为用户执行的,我们可以通过目录管理用户。

大多数帖子推断用户放弃并使用 SQL USER 身份验证(听起来像是一个管理难题),或者启用了从网络服务器到 SQL 服务器的匿名访问(也似乎在 DMZ 中使用网络服务器是个坏主意。

我是否完全不相信它会起作用?我知道这不是一个标准的 SO 问题,但我不确定该把它放在哪里。如果您知道任何 posts/pages 完成上述操作的地方(使用显式凭据连接 Windows 使用 sqlsrv 进行身份验证),请分享。

谢谢。

这通常用 Kerberos Constrained Delegation 完成。

这要求您的网站使用 Windows 身份验证(Kerberos,而非 NTLM),并且您的网站将无法访问用户的凭据。我不知道这在 PHP 中如何以及是否有效。但是在 ASP.NET 中有很多关于如何设置和执行的信息。基本上 IIS 有一个可以用来模拟的令牌。

如果您接受通过 Forms 或 Basic 身份验证的凭据,并希望使用这些凭据通过 Windows 身份验证连接到 SQL 服务器,您不能只将它们粘贴到连接字符串中。您必须使用模拟更改线程的安全上下文。

首先,您使用凭据执行实际登录 LoginUser API. Then you use the returned handle to ImpersonateLoggedOnUser. After with you can connect to SQL Server with Windows integrated auth. At the end of the request you would call RevertToSelf 以停止 运行 作为发出请求的最终用户。