【发布时间】:2013-02-19 04:19:36
【问题描述】:
我在 IIS 7 中的默认网站下有一个应用程序,每当我尝试访问同一域(但不同机器)上的另一个文档时,File.Exists 返回 False,即使该文档确实存在并且我可以从托管该站点的机器上很好地访问它。设置的 AD 部分似乎工作正常,我只是无法访问域中不同机器上的文档。这是我的 IIS 设置:
应用程序池:.NET 4.0,集成管道,并使用 ApplicationPoolIdentity 标识。我尝试过使用 NetworkService,但这似乎没有什么不同。
身份验证:我的应用程序仅启用了 ASP.NET 模拟和 Windows 身份验证。 bin文件夹是一样的。
如果还有其他与 IIS 设置相关的内容,请告诉我,我会添加。
我还尝试授予我的计算机对包含我尝试访问的文档(位于同一域中的另一台计算机上)的文件夹的完全权限。这似乎也没有什么不同。
以前有没有人遇到过这种情况,或者知道我可以尝试的其他任何事情,或者知道我可以检查的任何 IIS 设置?如果我可以在我的设置中添加任何其他相关内容,请告诉我!
更新:
是否有可能在调用System.IO.File.Exists() 时找出正在使用的身份或冒充谁,或者更具体地说,找出该方法 冒充的是谁?我尝试在调用File.Exists() 之前检查Thread.CurrentPrincipal.Identity.Name,它正确返回了我的域用户。
因此,当File.Exists() 执行时,似乎不是用户被冒充。更重要的是,如果在 IIS 中,我将 ASP.NET 模拟(在身份验证设置中)更改为使用我的特定域用户,一切正常!但是当我将它改回使用“Authenticated User”时,它没有?
我还可以确认,在 File.Exists() 之前调用 Principal.WindowsIdentity.GetCurrent.Name() 也会返回正确的域用户。
更新 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
【问题讨论】:
标签: authentication iis active-directory