1

我在 IIS 7 的默认网站下有一个应用程序,每当我尝试访问同一域(但不同的机器)上的另一个文档时File.ExistsFalse即使该文档确实存在并且我可以从机器上正常访问它,也会返回托管网站。设置的 AD 部分似乎工作正常,我只是无法访问域中不同机器上的文档。这是我的 IIS 设置:

  1. 应用程序池:.NET 4.0,集成管道,并使用 ApplicationPoolIdentity 标识。我试过使用 NetworkService 但这似乎没有什么不同。

  2. 身份验证:我的应用程序仅启用了 ASP.NET 模拟和 Windows 身份验证。bin 文件夹是一样的。

如果还有其他与 IIS 设置相关的内容,请告诉我,我会添加。

我还尝试授予我的机器对包含我尝试访问的文档(位于同一域中的另一台机器上)的文件夹的完全权限。这似乎也没有什么不同。

以前有没有人遇到过这个问题,或者知道我可以尝试的其他任何事情,或者知道我可以检查的任何 IIS 设置?如果我可以在我的设置中包含任何其他相关内容,请告诉我!

更新:

是否有可能找出正在使用的身份或在System.IO.File.Exists()调用时冒充谁,或者更具体地说,找出该方法冒充的是谁?我已经尝试Thread.CurrentPrincipal.Identity.Name在调用之前进行检查File.Exists(),它正确地返回了我的域用户。

因此,执行时似乎不是模拟用户File.Exists()。更重要的是,如果在 IIS 中,我将 ASP.NET 模拟(在身份验证设置中)更改为使用我的特定域用户,一切正常!但是当我将它改回使用“经过身份验证的用户”时,它不会吗?

我还可以确认Principal.WindowsIdentity.GetCurrent.Name()之前的调用File.Exists()也会返回正确的域用户。

更新 2:

我还尝试将应用程序池标识设置为我的特定域用户,这似乎也没有什么不同。在这一点上,我不确定在检查文件是否存在时它可能会模拟什么其他帐户?

更新 3:

我尝试在具有我要访问的文档的机器上使用Process Monitor,但是当我将其过滤为我正在寻找(或期望看到)的文件类型时,当我重新 -运行我的测试。我只能假设File.Exists()对您无权访问的文件进行操作,不注册到进程监视器?有没有其他方法可以让我找出哪个模拟用户/服务正在尝试(无法)访问这些文档?

更新 4:

使用下面@john 找到的示例,我尝试在检查文件是否存在之前以编程方式模拟登录用户:

Dim wID As WindowsIdentity = HttpContext.Current.User.Identity
Dim ctx As WindowsImpersonationContext = Nothing

ctx = wID.Impersonate()

If System.IO.File.Exists(sFile) Then

Else
   'Still gets here?
End If

但是,File.Exists()即使在模拟时仍然返回 false。

更新 5(解决方案):

我需要这个:

Using ctx As System.Security.Principal.WindowsImpersonationContext = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
   'My code here
End Using
4

1 回答 1

2

在 IIS 中,选择您的网站,然后转到身份验证,选择 Windows 身份验证,

  1. 选择高级设置 -> 确保内核模式已启用
  2. 选择Provider,检查Negotiate是否是mapping中的第一项

当您测试时只使用 IE 并从您的 Intranet 运行。

您还可以模拟特定用户,转到 ASP.NET 模拟,指定有权访问远程目录的用户。

于 2013-03-04T23:14:51.237 回答