首先是一些背景知识。我有一个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身份验证一起使用。 [客户:]
要了解发生了什么,我想我会设置一个简单的页面,告诉我当前用户对工作进程的看法。这是我遇到非常奇怪的结果的地方。以下是给出它们的结果及其服务器变量(实名取代上面提到的名称)
WindowsIdentity.GetCurrent().Name
Environment.UserName
pool.ProcessModel.UserName
Request.LogonUserIdentity.Name
1和4非常奇怪,并且不存在于Web服务器上的用户帐户。只有#3返回在站点的IIS应用程序池中看到的正确值。这是使用以下SO答案的注释中的方法得到的:https://stackoverflow.com/a/10101417/711674。
我的假设是,当服务器尝试使用SQL Server实例进行身份验证时,实际上不会使用该帐户,并且正在使用其中一个值,从而导致上面提到的错误消息。
答案 0 :(得分:2)
有一篇关于这件事的好文章here。简而言之:
您需要回答两个主要问题:
IIS的身份验证模式是什么? (匿名身份验证?Windows身份验证?两者?)
- 醇>
模仿
FastCGI
模块on
或off
? (即我的fastcgi.impersonate
文件中的php.ini
设置是否设为0
或1
?)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)。