我在IIS 7中的默认网站下有一个应用程序,并且每当我尝试访问同一个域(但不同的计算机)上的另一个文档时,File.Exists
返回False
,即使该文件确实存在,我可以通过托管该站点的计算机访问它。设置的AD部分似乎工作正常,我只是无法访问域中不同机器上的文档。这里是我的IIS设置:File.Exists在Active Directory环境中返回False
应用程序池:.NET 4.0,集成管道和使用ApplicationPoolIdentity标识。我试过使用NetworkService,但这似乎没有什么区别。
身份验证:我的应用程序仅启用了ASP.NET模拟和Windows身份验证。 bin文件夹是相同的。
如果还有什么与IIS设置相关的,请让我知道,我会得到它添加。
我也试过授予我的机器完全权限的文件夹,我试图访问该文件(这是在另一台机器在同一个域中)。这似乎也没有区别。
有没有人遇到过这种情况,或知道其他任何我可以尝试或知道的任何IIS设置,我可以检查?如果在我的设置中还有其他任何相关内容,请告诉我!
UPDATE:
是否有可能找出使用什么样的身份或谁被假冒时System.IO.File.Exists()
被调用,或者更具体地说找出谁该方法如,假冒?我试过在调用File.Exists()
之前检查Thread.CurrentPrincipal.Identity.Name
,并且正确返回我的域用户。
因此,执行File.Exists()
时看起来不是用户正在模拟。更重要的是,如果在IIS中,我更改ASP.NET模拟(在身份验证设置中)以使用我的特定域用户,一切正常!但是,当我改回它使用“认证用户”,它不?
我也可以确认在File.Exists()
之前调用Principal.WindowsIdentity.GetCurrent.Name()
也会返回正确的域用户。
更新2:
我也尝试应用程序池标识设置为我的特定领域的用户,这似乎不有所作为无论是。在这一点上,我不确定当检查文件是否存在时,可以模拟其他帐户?
更新3:
我拥有我想访问文件的设备上使用Process Monitor试过了,但是当我筛选下来到我要找的文件类型(或期待看到),当我重新运行我的测试时什么也没有显示。我只能假定对你无权访问的文件执行File.Exists()
,不会注册到进程监视器?有没有其他方法可以找出哪个模拟用户/服务尝试(无法)访问这些文档?
UPDATE 4:
使用下面@约翰发现的例子,我已经试过检查之前以编程模拟登录的用户,如果该文件存在:
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()
即使在模仿时仍然会返回错误。
UPDATE 5(液):
,我需要这样的:
Using ctx As System.Security.Principal.WindowsImpersonationContext = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
'My code here
End Using
谢谢你的回复,但我加倍检查,我已经正确设置了这些设置。另外,在IE中测试没有区别(我之前使用Chrome)。 – lhan 2013-03-05 13:41:21
其实,最后一点的工作 - 当我将ASP.NET身份验证从“身份验证用户”更改为我的帐户专门,它工作正常。我不明白为什么当它被设置为“Authenticated User”时它没有使用我的帐户?更重要的是,当使用“Authenticated User”时,我甚至在检查文件是否存在之前尝试调用'Thread.CurrentPrincipal.Identity.Name',并确保它返回正确的“domain \ username”,并且它! – lhan 2013-03-05 13:52:42
它与Web服务器无法通过Kerberos将凭据传递到远程计算机有关,请参阅http://forums.iis.net/t/1114220.aspx/1以获取解释。有另一种方式我使用编程模拟当您需要检查该文件,请参阅http://msdn.microsoft.com/en-us/library/ff647404.aspx – john 2013-03-05 23:03:31