【问题标题】:Connect to SQL SERVER 2008 (using Windows Authentication) via PHP in IIS7?在 IIS7 中通过 PHP 连接到 SQL SERVER 2008(使用 Windows 身份验证)?
【发布时间】:2012-03-07 07:47:34
【问题描述】:

我需要使用来自 PHP 代码的 Windows 身份验证连接到 Sql Server 2008,方法是传递用户名和密码,就像我们使用 SQL 身份验证连接到 Sql Server 时所做的那样。我需要根据 Windows Authentication 的 User/Password 对用户进行身份验证。

当我使用 SQL 身份验证时,我能够通过在数据源 (ODBC) 配置工具中创建一个名为 DBconnect 的系统 DSN 进行连接。然后我可以通过 SQL Server 身份验证成功验证登录 ID,并使用用户使用此 php 代码输入的登录 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。

这是针对我正在使用 http://example.net/Webservice/connect.php 构建的 flex 应用程序。 Flex 动态地将用户名/密码从表单传递到此弹出窗口并因此连接。但是,当提供错误的用户名/密码时,弹出窗口很难处理。它不断返回,flex 应用程序挂起。

如果在弹出窗口中输入错误的用户名/密码时可能会收到错误代码,则可能会解决问题。使用 Windows 身份验证连接 SQL Server 并直接传递用户名/密码的其他一些方法也可以解决我的问题。

【问题讨论】:

  • 我一直无法通过 Windows 身份验证通过传入 Windows 用户/密码连接到 SQL Server。您需要在活动目录上作为该用户进行预身份验证,然后在没有用户/密码的情况下登录。您是从 Windows 平台还是其他平台连接?您也可以尝试以 SQL 用户身份连接,然后使用 EXECUTE AS 更改为其他用户:msdn.microsoft.com/en-us/library/ms181362.aspx
  • 如果我理解正确,Windows 身份验证工作正常,只是当输入错误的登录名时,您无法在 Web 应用程序中处理?所以基本上 SQL Server 连接不是问题,它可以让您的特定 Web 开发平台捕获和管理不正确的登录

标签: php sql-server-2008 iis-7 windows-authentication


【解决方案1】:

当您使用 Windows 身份验证时,Sql Server 根本看不到您的用户名或密码。停下来再读一遍那句话,因为理解这一点非常重要。

要使 Windows 身份验证正常工作,您必须首先使用 Active Directory 域控制器 (DC)直接进行身份验证。当您成功登录后,DC 将为您的会话颁发一个安全令牌。这是您为 Sql Server Windows 身份验证提供的令牌,不是您的用户名或密码。 Sql Server 只验证令牌。

这就是 LDAP 方法不起作用的原因。 LDAP 仅提供来自 Active Directory 的“是/否”响应。 LDAP 不提供您需要的安全令牌。可以将其视为 Windows 等效于对 linux 服务器使用证书身份验证。此外,此令牌与建立连接的进程 相关联。它不是您可以在连接对象上设置的属性。这是一项安全功能,可让您难以窃取或劫持令牌。

这会在网站中产生问题,您需要一种方法来存储和管理该网站的每个用户的令牌,并将其附加到您的 Web 服务器进程。 IIS 为此提供了一种称为Impersonation 的机制。它最初是为 ASP.Net 构建的,但似乎 FastCGI 确实通过fastcgi.impersonate setting in the php.ini file 支持它。但请注意,我从未亲自尝试过使用它,所以我无法说出它的效果如何。

您还需要一种在公共页面预身份验证上连接到数据库的方法,以及一种将身份验证连接到 Active Directory 帐户的方法,这将限制您可用的身份验证机制。我自己不是普通的 PHP 用户,也不知道您的 AD 环境与您的 EC2 Web 服务器实例之间的关系,这是我所能带给您的。

【讨论】:

    【解决方案2】:

    要对 sql server 使用 windows 身份验证,您无需指定用户名和密码。相反,您更改连接字符串以实现集成安全性,如下所示:

    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 身份验证内容将是本地 Intranet:您的所有用户都是 Windows 域的一部分,或者信任它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2013-09-07
      • 2014-07-27
      • 2015-11-11
      相关资源
      最近更新 更多