【问题标题】:File.Exists returns False in Active Directory environmentFile.Exists 在 Active Directory 环境中返回 False
【发布时间】:2013-02-19 04:19:36
【问题描述】:

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

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

  2. 身份验证:我的应用程序仅启用了 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


    【解决方案1】:

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

    1. 选择高级设置 -> 确保内核模式已启用
    2. 选择 Provider,检查 Negotiate 是否是映射中的第一项

    当您测试时仅使用 IE 并从您的 Intranet 运行。

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

    【讨论】:

    • 感谢您的回复,但我仔细检查了这些设置已经正确设置。此外,在 IE 中进行测试没有任何区别(我之前使用的是 Chrome)。
    • 实际上,您的最后一点很有效 - 当我将 ASP.NET 模拟从“经过身份验证的用户”更改为我的帐户时,它工作正常。我不明白的是,为什么当它设置为“经过身份验证的用户”时它没有使用我的帐户?更重要的是,当使用“Authenticated User”时,我什至尝试在检查文件是否存在之前调用Thread.CurrentPrincipal.Identity.Name,并确保它返回正确的“域\用户名”,并且确实如此!
    • 这与 Web 服务器无法使用 Kerberos 将凭据传递给您的远程计算机有关,请参阅 forums.iis.net/t/1114220.aspx/1 以获得解释。当您需要检查文件时,我还使用了另一种以编程方式模拟的方法,请参阅msdn.microsoft.com/en-us/library/ff647404.aspx
    • 再次感谢。通读“双跳”场景,这听起来可能是问题所在。但是,我尝试使用WindowsImpersonationContext 示例以编程方式模拟,在调用Impersonate() 之后,File.Exists() 仍然返回false(我将更新我的帖子以向您展示我使用的代码)啊哈!
    • 有趣,我刚刚运行了一个测试,对我来说很好,但是我必须使用 IE,否则它不起作用。另外我假设您使用 Classic 作为应用程序池和
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2018-08-02
    • 2016-04-29
    • 1970-01-01
    • 2013-02-26
    • 2013-05-19
    相关资源
    最近更新 更多