sqlsrv_connect:Windows身份验证

时间:2014-10-14 20:04:13

标签: php sql-server iis

我在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身份验证尝试连接”。

这是:

  1. x使用workstation1 Windows帐户的用户访问server1
  2. 上托管的此网站
  3. server1执行上面的PHP代码,并尝试使用server2 Windows帐户从y检索数据(y在IIS设置中的应用程序池 - &gt;中定义。同一性)
  4. Windows帐户y可以访问数据库
  5. 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>
    

3 个答案:

答案 0 :(得分:0)

问题是IIS正在匿名向SQL发送连接,尽管您运行的是AppPool标识。要解决此问题,您必须启用从Web服务器(server1)到SQL服务器(server2)的匿名连接。

在SQL服务器上,为<YourDomain>\server1$创建一个登录名,并在用户映射标签下为Some_DB分配适当的权限。例如,授予此帐户db_datareaderdb_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;进行身份验证。显然,在尝试锁定访问权限时这并不是很有用。

你可以在这里看到这个:http://www.iis.net/learn/get-started/planning-for-security/understanding-built-in-user-and-group-accounts-in-iis

  

注意:IUSR帐户与其在网络上匿名行事的方式类似于LOCALSERVICE。 NETWORKSERVICE和LOCALSYSTEM帐户可以充当计算机标识,但IUSR帐户不能,因为它需要提升用户权限。如果您需要匿名帐户拥有网络权限,则必须手动创建新用户帐户并设置用户名和密码,就像过去一样进行匿名身份验证。

可在此处找到更多信息:http://www.iis.net/learn/get-started/whats-new-in-iis-7/changes-in-security-between-iis-60-and-iis-7-and-above

<强>解决方案: 转到身份验证部分,选择匿名身份验证,单击编辑...,然后从&#34;特定用户:IUSR&#34;更改到#34;应用程序池标识&#34;。这应该会强制网站使用您为应用池设置的帐户。

完成后,如果您使用&#34;应用程序池标识&#34;的默认应用程序池设置,您的应用程序将尝试使用SQL作为DOMAIN \ MACHINENAME进行身份验证。