如何在IIS7中使用PHP通过Windows身份验证连接到SQL SERVER 2008?

3
我需要通过PHP代码使用Windows身份验证连接到Sql Server 2008,并像使用SQL身份验证连接到Sql Server时一样传递用户名和密码。我需要基于Windows身份验证的用户/密码进行身份验证。
当我使用SQL身份验证时,我能够通过在数据源(ODBC)配置工具中创建名为“DBconnect”的系统DSN来连接。然后,我可以使用以下php代码成功验证登录ID并使用用户输入的登录ID和密码连接到数据库:
$con = odbc_connect("DBconnect", "sql_user", "sql_password");

现在当SQL Server使用Windows身份验证时,我需要做同样的事情。 我想在数据源(ODBC)配置工具中创建一个名为DBConnect_NT的系统DSN,并将其设置为使用网络登录ID使用Windows身份验证验证登录ID的真实性。
我有这段代码:
$con = odbc_connect("DBconnect_NT", "windows_user", "windows_pass");

但是它没有起作用。我得到了这个错误:

查询准备/执行错误。28000

我在IIS7管理器的身份验证部分更改了一些设置。

Windows Authentication = Enabled
Anonymous Authentication = Disabled

现在我可以使用这段代码:
$con = odbc_connect("DBconnect_NT", "", ""); 

当我在打字输入用户名和密码时,就会看到一个弹出窗口提示我登录。它连接成功后,我可以使用相同的$con连接对象进行其他查询。
不幸的是,基于这种方法,我无法对网站上的用户进行身份验证。当我在弹出窗口中输入错误的用户名和密码时,它没有任何响应(弹出窗口会再次出现)。如果我取消弹出窗口,它将显示401错误:
401-未经授权:由于凭据无效而拒绝访问。
我是否使用正确的方式通过Windows身份验证连接到SQL Server?是否有其他可能的方法通过动态传递Windows身份验证用户名和密码连接SQL Server?
我也尝试使用LDAP来对Active Directory进行身份验证,但它不起作用。
我正在使用Amazon EC2机器上的SQL SERVER 2008、IIS7和PHP5.3。
这是我正在使用的Flex应用程序:http://example.net/Webservice/connect.php。Flex从表单动态地将用户名/密码传递给此弹出窗口,因此连接。但是,当提供错误的用户名/密码时,弹出窗口难以处理。它不断回来,并使Flex应用程序挂起。
如果在弹出窗口中输入错误的用户名/密码时能够接收到错误代码,那么可能会解决问题。其他通过Windows身份验证连接SQL Server并直接传递用户名/密码的方法也可以解决我的问题。

我从未能够通过传递Windows用户/密码来使用Windows身份验证连接到SQL Server。您需要作为该用户在Active Directory上进行预身份验证,然后无需用户/密码登录。您是从Windows平台还是其他平台连接的?您也可以尝试作为SQL用户连接,然后使用EXECUTE AS更改为不同的用户:https://msdn.microsoft.com/en-us/library/ms181362.aspx - Nick.McDermaid
如果我理解正确的话,Windows身份验证工作正常,只是当输入错误的登录时,您无法在Web应用程序中处理它?因此,基本上SQL Server连接不是问题,而是让您特定的Web开发平台捕获和管理错误登录。 - Nick.McDermaid
2个回答

1
当您使用Windows身份验证时,SQL Server根本不会看到您的用户名或密码。停下来再读一遍这句话,因为理解这点非常重要。 对于Windows身份验证工作,您必须首先直接通过Active Directory域控制器(DC)进行身份验证。当您成功登录时,DC将为您的会话发出一个安全令牌。正是这个令牌提供给Sql Server Windows身份验证工作,而不是您的用户名或密码。 Sql Server只验证令牌。
这就是为什么LDAP方法不起作用的原因。 LDAP仅从Active Directory提供“是/否”响应。 LDAP不提供所需的安全令牌。可以将其视为使用证书身份验证连接到Linux服务器的Windows等效方法。此外,此令牌与建立连接的进程相关联。它不是您可以在连接对象上设置的属性。这是一个安全功能,使窃取或劫持令牌变得困难。
这在网站中会产生问题,因为您需要一种方法来存储和管理每个用户的令牌,并将其附加到您的Web服务器进程。IIS提供了一个名为模拟的机制。它最初是为ASP.Net构建的,但似乎FastCGI也通过php.ini文件中的fastcgi.impersonate设置支持它。但请注意,我从未亲自尝试过使用它,因此无法保证其有效性。
您还需要一种在公共页面进行身份验证之前连接到DB的方法,并将身份验证连接到Active Directory帐户,这将限制可用的身份验证机制。作为非常规PHP用户,我不知道您的AD环境与EC2 Web服务器实例的关系,所以我只能告诉您这些。

0

要使用Windows身份验证来连接SQL Server,您不需要指定用户名和密码。相反,您需要更改连接字符串以启用集成安全性,例如:

Connection string = "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;"

或者针对受信任的连接的变体:

Connection string = "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"

如果您正在使用ODBC DSN,则可以以类似的方式跳过用户名和密码。

此外,您需要了解在此情况下,Windows用户连接到数据库的是运行您网站的IIS帐户。您所做的Windows身份验证工作将成为本地内部网络:所有用户都是Windows域的一部分或与其建立了信任关系。

如果您在此处搜索IIS PHP和SQL服务器,则会获得一些可能有用的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接