Authentication 在Active Directory环境中,File.Exists返回False
我在IIS 7中的默认网站下有一个应用程序,每当我尝试访问同一域(但不同计算机)上的另一个文档时,Authentication 在Active Directory环境中,File.Exists返回False,authentication,iis,active-directory,Authentication,Iis,Active Directory,我在IIS 7中的默认网站下有一个应用程序,每当我尝试访问同一域(但不同计算机)上的另一个文档时,File.Exists返回False,即使该文档确实存在,并且我可以从承载该站点的计算机上很好地访问它。设置的广告部分似乎工作正常,我只是无法访问域中不同机器上的文档。以下是我的IIS设置: 应用程序池:.NET 4.0,集成管道,并使用ApplicationPoolIdentity标识。我尝试过使用NetworkService,但似乎没有什么不同 身份验证:我的应用程序仅启用了ASP.NET模拟和
File.Exists
返回False
,即使该文档确实存在,并且我可以从承载该站点的计算机上很好地访问它。设置的广告部分似乎工作正常,我只是无法访问域中不同机器上的文档。以下是我的IIS设置:
System.IO.File.Exists()
时,是否可以找出正在使用的标识或正在模拟的身份,或者更具体地说,可以找出该方法模拟的身份?在调用File.Exists()
之前,我尝试检查Thread.CurrentPrincipal.Identity.Name
,它正确地返回了我的域用户
因此,在执行File.Exists()
时,似乎没有模拟用户。更重要的是,如果在IIS中,我将ASP.NET模拟(在身份验证设置中)更改为使用我的特定域用户,则一切正常!但当我将其更改回使用“已验证用户”时,它不会吗
我还可以确认在File.Exists()
之前调用Principal.WindowsIdentity.GetCurrent.Name()
也会返回正确的域用户
更新2:
我还尝试将应用程序池标识设置为我的特定域用户,这似乎也没有什么不同。在这一点上,我不确定在检查文件是否存在时,它会模拟什么其他帐户
更新3:
我曾尝试在包含我试图访问的文档的机器上使用,但当我将其筛选为我要查找(或期望看到)的文件类型时,在重新运行测试时,什么都没有显示。我只能假设对您无权访问的文件执行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
在IIS中,选择您的网站,然后转到身份验证,选择Windows身份验证
您还可以模拟特定用户,转到ASP.NET模拟,指定有权访问远程目录的用户 谢谢你的回复,但是我仔细检查了一下,我已经正确设置了这些设置。另外,在IE中测试也没有什么不同(我以前使用的是Chrome)。事实上,你的最后一点起作用了——当我将ASP.NET模拟从“已验证用户”更改为我的帐户时,效果很好。但我不明白的是,为什么它在设置为“已验证用户”时没有使用我的帐户?此外,当使用“Authenticated User”时,我甚至尝试在检查文件是否存在之前调用
Thread.CurrentPrincipal.Identity.Name
,并确保它返回正确的“domain\username”,确实如此!这与Web服务器无法使用Kerberos将凭据传递到远程计算机有关,请参阅以获取解释。当您需要检查文件时,我还使用了另一种编程模拟的方法,请参见“再次感谢”。通读“双跳”场景,这听起来可能就是问题所在。但是,我尝试使用WindowsImpersonationContext
示例以编程方式模拟,在调用impersonate()
之后,File.Exists()
仍然返回false(我将更新我的帖子以向您展示我使用的代码)啊!有趣的是,我刚刚运行了一个测试,对我来说很好,但我必须使用IE,否则它就不起作用了。另外,我假设您正在使用Classic作为应用程序池和