IIS仍然通过池身份访问资源,而不是模拟用户。

3

我希望你能帮忙翻译一下关于IT技术的内容。以下是需要翻译的内容:

我已经束手无策了!

在Server 2003上,我配置了一个使用基本认证和专用账户的应用程序池的内部网站应用。

在web.config中我正在指定

   <authentication mode="Windows" />
   <identity impersonate="true"/>

在MVC 3中的一个视图:

<p>Environment.UserName (authentication): @Environment.UserName</p>
<p>User.Identity.Name (asp.net account): @User.Identity.Name</p>

这个示例展示了我的域账户被正确获取(我必须通过对话框登录应用程序)。太好了!
但是等等!当应用程序访问文件系统或 SQL Server(另一台机器)时,它并不是通过我的域账户访问的,而是通过池账户访问的。我可以看到 SQL 登录通过分析工具进入。通过文件系统权限验证,我也确认了这一点。如果我将池设置为使用 NETWORK SERVICES,即使我使用的域账户拥有权限并可以交互地创建本地文件,我也无法创建本地文件。如果我将 NS 账户授予权限,它就能正常工作。所以我知道,尽管视图确认了我正在模仿身份验证,但资源请求并没有使用该帐户,而是使用池的帐户。
如果我关闭身份验证,视图中出现了池 ID,这是预期的。
根据我所读的,我应该能够使用基本身份验证来访问远程 SQL Server,对吧?更别说本地磁盘了。我就是不明白!
非常感谢您提供任何建议。谢谢!
1个回答

3

冒充操作在IIS中结束。为了继续将用户凭据传递到第二个远程服务器,您需要在Web服务器和文件服务器之间启用委派。这是Active Directory中计算机之间的一个比特标志设置。


1
谢谢Jason。我的印象是委托不适用于这种情况,因为我们正在使用基本身份验证-即IIS将使用凭据转发令牌。我找到了一份来自前雇员的文档,描述了一个与您的说法相符的过程,但它很深奥。您能解释一下为什么即使是本地资源(文件I/O),也不会在模拟帐户下进行吗? - Todd Beaulieu
由于您正在离开http/IIS的上下文,这是有意设计的,因为允许客户端访问虚拟目录之外的服务器将会产生巨大的安全漏洞。 - Jason Meckley
我一直在研究委托。有两个值得注意的问题:
  1. 根据微软文档(http://msdn.microsoft.com/en-us/library/ff647404.aspx),基本身份验证将自动委派。我已经多次遇到这种说法。从我的角度来看,这应该涵盖了我的情况。以下是一个直接引用:
- Todd Beaulieu
1
使用基本身份验证和模拟用户。使用基本身份验证,用户的用户名和密码以明文形式在服务器上可用。当IIS使用基本身份验证对调用者进行身份验证时,它会创建包含这些凭据的令牌。该令牌可以用于网络访问。因此,如果您通过使用<identity>元素模拟原始调用者或通过使用WindowsIdentity.Impersonate进行编程模拟,则可以在模拟身份的同时访问网络资源。 - Todd Beaulieu
在同一台服务器上,我有另一个 Web 应用程序,其配置方式与此相同(据我所知),而且它可以正常工作!我以相同的方式输入我的凭据并跟踪它的数据库调用,这些调用是在我的帐户下进行的,而不是池的服务帐户。我甚至将我的应用程序指向了同一个池。就好像我缺少一个“特定于应用程序”的设置。我已比较了两个 web.config 文件,并且它们具有相同的两个模拟设置。我已比较了虚拟目录属性,它们看起来都是相同的! - Todd Beaulieu
1
我已经非常接近让所有东西都能正常工作了。第一个问题是没有人提到的,就是当Application_Start执行时,它是在池的身份下运行的。Session_Start具有模拟的身份。这解释了我大部分的挣扎和浪费时间。最后一件我无法让其正常工作的事情是通过DNS名称进行Windows身份验证。它可以通过NetBIOS名称工作。我尝试添加两个SPN来将机器和fq机器名称都指向池使用的域/帐户。但没有成功。提示输入用户名和密码,然后无法委派,导致匿名。 - Todd Beaulieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接