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

问题描述 投票:2回答:2

我需要通过传递用户名和密码来使用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 Manager的Authentication部分中更改了一些设置

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

php sql-server-2008 iis-7 windows-authentication
2个回答
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服务器,您将获得一些可能有用的信息。


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服务器实例有什么关系,这就是我可以带你去的。

© www.soinside.com 2019 - 2024. All rights reserved.