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

时间:2013-03-04 22:29:38

标签: authentication iis active-directory

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

  1. 应用程序池:.NET 4.0,集成管道,以及使用ApplicationPoolIdentity标识。我尝试过使用NetworkService,但这似乎没什么区别。

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

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

    我还尝试在我正在尝试访问的文档(位于同一域中的另一台计算机上)的文件夹上授予我的计算机完全权限。这似乎也没有什么区别。

    之前是否有人遇到此问题或知道我可以尝试或知道我可以检查的任何IIS设置?如果我的设置中还包含其他相关信息,请告诉我们!

    更新

    是否有可能在调用System.IO.File.Exists()时找出正在使用的身份或被模仿的人,或者更具体地说明该方法模仿的人?我在调用Thread.CurrentPrincipal.Identity.Name之前尝试检查File.Exists(),并且正确返回我的域用户。

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

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

    更新2:

    我还尝试将应用程序池标识设置为我的特定域用户,这似乎也没有什么区别。此时,我不确定在检查文件是否存在时可以冒充其他帐户吗?

    更新3:

    我已经尝试在拥有我正在尝试访问的文档的计算机上使用Process Monitor,但是当我将其过滤到我正在寻找(或期望看到)的文件类型时,没有任何内容当我重新运行我的测试时出现。我只能假设对您无权访问的文件执行File.Exists(),不注册到Process Monitor?有没有其他方法可以让我找出哪些模仿用户/服务正在尝试(无法)访问这些文档?

    更新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
    

1 个答案:

答案 0 :(得分:2)

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

  1. 选择高级设置 - >确保启用内核模式
  2. 选择提供商,检查协商是否是映射中的第一项
  3. 当您仅测试使用IE并从Intranet运行时。

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