哪个用户在与SQL Server的可信连接中使用 - IIS / ASP.NET

时间:2016-08-26 22:56:24

标签: sql-server iis iis-7.5 sql-server-2014 windows-authentication

首先是一些背景知识。我有一个ASP.NET应用程序,它位于我们网络上的DMZ中。它需要访问位于我们可信网络中的计算机上的SQL Server实例。我将调用Web服务器WebServer1和示例SQL Server SqlServer1

目前,我们的Web服务器正在使用包含用户ID和密码的连接字符串。这并不理想,我们希望使用Windows身份验证来连接到数据库。

为此,我设置了一个用户帐户&我们域名上的密码,我称之为MyDomain\WebApp。我将站点应用程序池的标识设置为此新帐户,并为站点设置匿名身份验证以使用应用程序池的标识。

但是,当我尝试更改连接字符串时,将UserID=fakeuser, Password=fakepass替换为Trusted_Connection=Yes,从Web应用程序启动数据库调用会导致错误消息

  

登录失败。登录来自不受信任的域,不能与Windows身份验证一起使用。

编辑:这是SQL Server错误日志中的完整错误消息:

  

SSPI握手失败,错误代码为0x8009030c,状态为14,同时建立与集成安全性的连接;连接已关闭。原因:AcceptSecurityContext失败。 Windows错误代码指示失败的原因。登录尝试失败[客户端:]

     

错误:18452,严重性:14,状态:1。

     

登录失败。登录来自不受信任的域,不能与Windows身份验证一起使用。 [客户:]

要了解发生了什么,我想我会设置一个简单的页面,告诉我当前用户对工作进程的看法。这是我遇到非常奇怪的结果的地方。以下是给出它们的结果及其服务器变量(实名取代上面提到的名称)

  1. WebServer1 \ WebApp = WindowsIdentity.GetCurrent().Name
  2. WebApp = Environment.UserName
  3. MyDomain \ WebApp = pool.ProcessModel.UserName
  4. WebServer1 \ WebApp = Request.LogonUserIdentity.Name
  5. 1和4非常奇怪,并且不存在于Web服务器上的用户帐户。只有#3返回在站点的IIS应用程序池中看到的正确值。这是使用以下SO答案的注释中的方法得到的:https://stackoverflow.com/a/10101417/711674

    我的假设是,当服务器尝试使用SQL Server实例进行身份验证时,实际上不会使用该帐户,并且正在使用其中一个值,从而导致上面提到的错误消息。

1 个答案:

答案 0 :(得分:2)

有一篇关于这件事的好文章here。简而言之:

  

您需要回答两个主要问题:

     
      
  1. IIS的身份验证模式是什么? (匿名身份验证?Windows身份验证?两者?)

  2.   
  3. 模仿FastCGI模块onoff? (即我的fastcgi.impersonate文件中的php.ini设置是否设为0或   1?)

  4.         

    A. :启用IIS匿名身份验证并fastcgi.impersonate = 1

         

    因为我匿名连接到IIS,内置匿名   帐户(IIS 7.0+中默认为NT AUTHORITY\IUSER)是   冒充。所以,我的连接尝试失败了,因为这个身份   不映射到我服务器上的有效登录。

         

    B。启用了IIS匿名身份验证和fastcgi.impersonate = 0

         

    因为假冒已经关闭,我的身份并没有被用作   PHP进程的身份。相反,PHP的实际身份   在连接尝试中使用了进程。在IIS 7.5中,标识   PHP进程的大小取决于它的应用程序池的身份   正在运行。在这种情况下,PHP位于默认应用程序池中   并且连接尝试中使用的标识是IIS APPPOOL\DefaultAppPool(因此我的连接尝试失败)。

         

    C。启用IIS Windows身份验证并fastcgi.impersonate = 1

         

    启用Windows身份验证(和匿名身份验证   禁用),我用我的Web浏览器的身份连接到IIS   在(Microsoft\brian.swan下运行,我登录的身份   用)。并且,通过模拟,PHP进程运行在   Microsoft\brian.swan身份。所以,因为那个身份映射到了   在我的服务器上有效登录,我的连接尝试成功。

         

    D。启用IIS Windows身份验证并fastcgi.impersonate = 0

         

    此处的结果与匿名身份验证相同   已启用且fastcgi.impersonate = 0(连接尝试失败)。   当我从Web请求页面时,唯一的区别就出现了   服务器:当我请求时,弹出窗口询问我的身份   页。

         

    E。启用了匿名和Windows身份验证:

         

    Web浏览器将尝试使用匿名访问Web服务器   认证首先。因此,如果同时使用匿名和Windows身份验证   两者都启用,结果将与上面的那些相同   启用匿名身份验证(A和B)。