我可以强制sqlsrv_connect(PHP)使用提供的凭据进行Windows身份验证吗?

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

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

使用旧的API设置,使用提供的用户名和密码通过mssql_connect进行身份验证,并连接到sql server而没有任何问题 . 用户名和密码是DOMAIN凭据,并在SQL SERVER上设置为GROUPS . 这使得添加/删除用户变得更加容易,而且效果非常好 .

新的API设置尝试#1: - sqlsrv_connect:提供用户名和密码强制sqlsrv_connect使用SQL USER身份验证而不是WINDOWS身份验证 . 由于用户在域中但未直接分配给SQL SERVER,因此失败 .

尝试#2: - sqlsrv_connect:不提供用户名和密码强制sqlsrv_connect通过Windows身份验证与设置凭据(不是我们需要的)连接 . 是的,我们可以将这些凭据设置为我们想要的任何内容,但是SQL SERVER中检查用户名的任何存储过程都可能返回我们的“set user”,而不是实际的客户端用户名 .

尝试#3: - PDO:sqlsrv: - 有和没有用户名相同的东西 .

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

我已经从谷歌,stackoverflow和其他地方读过关于这个话题的很多帖子 . 它们中没有一个解决了在DMZ中托管的API,您不希望WEBSERVER ITSELF拥有可以访问数据库的凭据 . 我们需要的是将USER SUPPLIED凭证作为“Windows身份验证”(而不是SQL用户)通过API(Web服务器)传递到SQL服务器 . 这样,对SQL服务器的任何查询都以“用户”的形式执行,我们可以通过目录管理用户 .

大多数帖子推断用户放弃并使用SQL USER身份验证(听起来像管理层头痛),或启用从Web服务器到SQL服务器的匿名访问(对于DMZ中的Web服务器来说,这似乎也是个坏主意) .

我完全不喜欢摇杆,希望这能奏效吗?我知道这不是一个标准的SO问题,但我不确定在哪里提出这个问题 . 如果您知道完成上述操作的任何帖子/页面(使用显式凭据连接Windows身份验证与sqlsrv),请分享 .

谢谢 .

回答(1)

2 years ago

这通常用Kerberos Constrained Delegation完成 .

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

如果您接受基于Forms或Basic身份验证的凭据并希望使用这些凭据使用Windows身份验证连接到SQL Server,则不能将它们粘贴到连接字符串中 . 您必须使用Impersonation更改线程的安全上下文 .

首先,您使用凭据使用LoginUser API执行实际登录 . 然后使用返回的句柄ImpersonateLoggedOnUser . 之后,您可以使用Windows集成身份验证连接到SQL Server . 在请求结束时,您将调用RevertToSelf以停止作为请求最终用户运行 .