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

时间:2012-02-15 22:17:32

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

我需要通过传递用户名和密码来使用PHP代码中的Windows身份验证连接到Sql Server 2008,就像我们使用SQL身份验证连接到Sql Server时那样。我需要根据Windows身份验证的用户/密码对用户进行身份验证。

当我使用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并直接传递用户名/密码的其他一些方法也可以解决我的问题。

2 个答案:

答案 0 :(得分:0)

要对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服务器,你会得到一些可能有用的信息。

答案 1 :(得分:0)

使用Windows身份验证时,Sql Server根本看不到您的用户名或密码。停止并再次阅读该句子,因为理解这一点非常重要。

要使Windows身份验证生效,您必须首先使用Active Directory域控制器(DC)对直接进行身份验证。成功登录后,DC将为您的会话发出安全令牌。这是您为Sql Server Windows身份验证提供的令牌,而不是您的用户名或密码。 Sql Server仅验证令牌。

这就是LDAP方法不起作用的原因。 LDAP仅从Active Directory提供“是/否”响应。 LDAP不提供您需要的安全令牌。可以把它想象成等同于使用证书认证到Linux服务器的Windows。此外,此令牌与进行连接的进程相关联。它不是您可以在连接对象上设置的属性。这是一项安全功能,可以很难窃取或劫持令牌。

这会在网站中产生问题,您需要一种方法来为网站的每个用户存储和管理令牌,并将其附加到您的Web服务器进程。 IIS为此提供了一种称为Impersonation的机制。它最初是为ASP.Net构建的,但似乎FastCGI确实通过fastcgi.impersonate setting the php.ini file支持它。

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