Authentication 在Active Directory环境中,File.Exists返回False

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模拟和

我在IIS 7中的默认网站下有一个应用程序,每当我尝试访问同一域(但不同计算机)上的另一个文档时,
File.Exists
返回
False
,即使该文档确实存在,并且我可以从承载该站点的计算机上很好地访问它。设置的广告部分似乎工作正常,我只是无法访问域中不同机器上的文档。以下是我的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模拟(在身份验证设置中)更改为使用我的特定域用户,则一切正常!但当我将其更改回使用“已验证用户”时,它不会吗

    我还可以确认在
    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身份验证

  • 选择高级设置->确保启用了内核模式
  • 选择提供者,检查协商是否是映射中的第一项
  • 当您测试时,只使用IE并从您的内部网运行


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

    谢谢你的回复,但是我仔细检查了一下,我已经正确设置了这些设置。另外,在IE中测试也没有什么不同(我以前使用的是Chrome)。事实上,你的最后一点起作用了——当我将ASP.NET模拟从“已验证用户”更改为我的帐户时,效果很好。但我不明白的是,为什么它在设置为“已验证用户”时没有使用我的帐户?此外,当使用“Authenticated User”时,我甚至尝试在检查文件是否存在之前调用
    Thread.CurrentPrincipal.Identity.Name
    ,并确保它返回正确的“domain\username”,确实如此!这与Web服务器无法使用Kerberos将凭据传递到远程计算机有关,请参阅以获取解释。当您需要检查文件时,我还使用了另一种编程模拟的方法,请参见“再次感谢”。通读“双跳”场景,这听起来可能就是问题所在。但是,我尝试使用
    WindowsImpersonationContext
    示例以编程方式模拟,在调用
    impersonate()
    之后,
    File.Exists()
    仍然返回false(我将更新我的帖子以向您展示我使用的代码)啊!有趣的是,我刚刚运行了一个测试,对我来说很好,但我必须使用IE,否则它就不起作用了。另外,我假设您正在使用Classic作为应用程序池和