首页 文章

sqlsrv_connect:Windows身份验证

提问于
浏览
0

我在IIS下运行这个PHP代码:

$serverName = "someServer\someServer";
$connectionInfo = array( "Database"=>"SOME_DB");

$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
     echo "Connection established.
"; }else{ echo "Connection could not be established.
"; die( print_r( sqlsrv_errors(), true)); }

当我尝试访问该页面时,我收到错误:

[Microsoft] [SQL Server Native Client 10.0] [SQL Server]用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败 .

这是令人困惑的,因为documentation here说"The connection will be attempted using Windows Authentication" .

这个流程是:

  • workstation1 上使用 x Windows帐户的用户访问此网站 server1

  • server1 执行上面的PHP代码并尝试使用 y Windows帐户从 server2 检索数据( y 在IIS设置中的应用程序池 - >标识下定义)

  • Windows帐户 y 可以访问该数据库

IIS池在Windows域用户"domainadm"下运行,该用户可以访问 SOME_DB 数据库及其所在的服务器 .

为什么要尝试匿名进行身份验证?如何解决这个问题,以便它在IIS池运行的用户下运行?

在php.ini中:

fastcgi.impersonate = 1;

检查IIS中的身份验证部分,我唯一的选项是“匿名身份验证”或“ASP.NET模拟” . 没有Windows身份验证?

Anonymous目前已启用,它会出现上述错误 . 如果我切换到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

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

    在SQL服务器上,为 <YourDomain>\server1$ 创建登录名,并在“用户映射”选项卡下为 Some_DB 分配适当的权限 . 例如,为此帐户提供 db_datareaderdb_datawriter 权限,您应该能够连接并成功完成CRUD操作 . 为了进行测试,您可能只想暂时在 Some_DB 上授予此登录 db_owner 权限,以确保SQL权限不存在问题 .

    关于PHP fastcgi.impersonate 设置 - 我相信你可以将它设置为0 / false,因为在这种情况下它不重要 .

  • 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 .

    然后,您可以根据需要指定其他帐户,例如您的“domainadm”帐户是一个服务帐户,用于运行应用程序池 . 但是,如果用户不在同一个域上,并且由于配置服务器/帐户的方式可能会导致此失败,则可能会出现问题 . 但尝试上述步骤将使其运行,以便您可以在必要时诊断这些问题 .

  • 0

    此处针对Windows身份验证或模拟的建议不适用于您的案例 . Windows auth将用于客户端计算机“x”以使用您的前端“server1”进行身份验证,并且模拟将用于将该凭据“x”转发到SQL“server2” . 这将要求每个使用该站点的用户都被授予SQL访问权限 . 您希望匿名访问您的站点,并让站点管理自己的SQL访问权限 .

    Problem Summary: 匿名身份验证的默认用户是IUSR,无论您的应用程序池设置是什么 . 当它尝试连接到网络资源时,它将验证为"NT AUTHORITY\ANONYMOUS LOGIN" . 显然,在尝试锁定访问时,这不是很有用 .

    你可以在这里看到这个: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

    Solution: 转到在Authentication部分,选择Anonymous Authentication,单击Edit ...,然后从"Specific User: IUSR"更改为"Application pool identity" . 这应该强制网站使用您为应用池设置的帐户 .

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

相关问题