我在IIS下运行这个PHP代码:
$serverName = "someServer\someServer";
$connectionInfo = array( "Database"=>"SOME_DB");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
}else{
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
当我尝试访问该页面时,收到错误:
[Microsoft] [SQL Server Native Client 10.0] [SQL Server]用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。
这令人困惑,因为documentation here说“将使用Windows身份验证尝试连接”。
这是:
x
使用workstation1
Windows帐户的用户访问server1
server1
执行上面的PHP代码,并尝试使用server2
Windows帐户从y
检索数据(y
在IIS设置中的应用程序池 - &gt;中定义。同一性)y
可以访问数据库 IIS池在Windows域用户“domainadm”下运行,该用户可以访问SOME_DB
数据库及其所在的服务器。
为什么要尝试匿名进行身份验证?如何解决这个问题,以便它在IIS池运行的用户下运行?
在php.ini中:
fastcgi.impersonate = 1;
检查IIS中的身份验证部分,我唯一的选择是“匿名身份验证”或“ASP.NET模拟”。没有Windows身份验证?
目前已启用匿名,这会出现上述错误。如果我切换到ASP.NET,我在访问页面时会出现此错误:
500 - 内部服务器错误。您正在查找的资源存在问题,无法显示。检测到的ASP.NET设置不适用于集成管理管道模式。
我更新了web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Detailed" />
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
<system.web>
<identity impersonate="true" />
<authentication mode="Windows" />
<customErrors mode="Off" />
<compilation debug="true" />
</system.web>
</configuration>
答案 0 :(得分:0)
问题是IIS正在匿名向SQL发送连接,尽管您运行的是AppPool标识。要解决此问题,您必须启用从Web服务器(server1)到SQL服务器(server2)的匿名连接。
在SQL服务器上,为<YourDomain>\server1$
创建一个登录名,并在用户映射标签下为Some_DB
分配适当的权限。例如,授予此帐户db_datareader
和db_datawriter
权限,您应该能够连接并成功完成CRUD操作。为了进行测试,您可能只想暂时在db_owner
上授予此登录Some_DB
权限,以确保SQL权限不存在问题。
关于PHP fastcgi.impersonate
设置 - 我相信您可以将其设置为0 / false,因为在这种情况下它不会起作用。
答案 1 :(得分:0)
在IIS中,在身份验证部分中,启用Windows身份验证和ASP.NET模拟。
这些将是IIS中将启用的唯一身份验证类型。
在web.config文件中,您将需要以下内容(如果Windows不显示,这应解决问题):
<system.web>
<identity impersonate="true" />
<authentication mode="Windows" />
identity.impersonate的原因是您需要它来通过Windows模拟登录的用户凭据。
用户通过身份验证后,您可以使用匿名身份验证来访问数据库。
例如为了证明上述工作,在您的数据库中转到安全 - 登录SQL Server和添加登录。
添加: NT AUTHORITY \ ANONYMOUS LOGON
并为其指定dboOwner角色以确保其正常工作。
执行上述操作将证明与IIS的设置方式没有其他冲突 - 例如web.config条目不正确。
确保应用程序池在集成模式下运行,并且数据库连接字符串中的Integrated Security = true。
然后,您可以根据需要指定其他帐户,例如你的&#34; domainadm&#34;帐户服务帐户以运行应用程序池。但是,如果用户不在同一个域上,并且由于配置服务器/帐户的方式可能会导致此操作失败,则可能会出现问题。但尝试上述步骤将使其运行,以便您可以在必要时诊断这些问题。
答案 2 :(得分:0)
此处针对Windows身份验证或模拟的建议不适用于您的案例。 Windows身份验证将用于客户端计算机&#34; x&#34;使用您的前端&#34; server1&#34;进行身份验证,并且模拟将用于转发该凭据&#34; x&#34;到SQL&#34; server2&#34;。这将要求每个使用该站点的用户都被授予SQL访问权限。您希望匿名访问您的站点,并让站点管理自己对SQL的访问。
问题摘要: 无论您的应用程序池设置是什么,Anonymous Auth的默认用户都是IUSR。当它尝试连接到网络资源时,它会以&#34; NT AUTHORITY \ ANONYMOUS LOGIN&#34;进行身份验证。显然,在尝试锁定访问权限时这并不是很有用。
注意:IUSR帐户与其在网络上匿名行事的方式类似于LOCALSERVICE。 NETWORKSERVICE和LOCALSYSTEM帐户可以充当计算机标识,但IUSR帐户不能,因为它需要提升用户权限。如果您需要匿名帐户拥有网络权限,则必须手动创建新用户帐户并设置用户名和密码,就像过去一样进行匿名身份验证。
<强>解决方案:强> 转到身份验证部分,选择匿名身份验证,单击编辑...,然后从&#34;特定用户:IUSR&#34;更改到#34;应用程序池标识&#34;。这应该会强制网站使用您为应用池设置的帐户。
完成后,如果您使用&#34;应用程序池标识&#34;的默认应用程序池设置,您的应用程序将尝试使用SQL作为DOMAIN \ MACHINENAME进行身份验证。