遇到一个问题,在某些服务器上,我们在使用 Path.GetTempFileName 时收到目录名称无效的错误。进一步调查表明,它正在尝试将文件写入 c:\Documents 和 Settings\computername\aspnet\local settings emp (通过使用 Path.GetTempPath 找到)。该文件夹存在,因此我假设这一定是与 asp.net 帐户相关的权限问题。

有人告诉我 Path.GetTempFileName 应该指向 C:\Windows\Microsoft.NET\Framework\v2.0.50727 emporaryasp.net 文件。

我还被告知此问题可能是由于 IIS 和 .NET 在服务器上的安装顺序造成的。我已经完成了典型的“aspnet_regiis -i”并检查了文件夹等的安全性。此时我被困住了。

有人能解释一下吗?

**更新:**事实证明,提供对文件夹的“IUSR_ComputerName”访问权限可以解决问题。这是正确的程序吗?我似乎不记得过去这样做过,显然,我想遵循最佳实践来维护安全。毕竟,这是文件上传过程的一部分。

有帮助吗?

解决方案

这可能是假冒和不同身份验证方法不匹配的组合。

有很多件;我会尝试一一回顾它们。

冒充 是一种“临时”切换线程运行的用户帐户的技术。本质上,该线程短暂地获得了与被模拟帐户相同的权利和访问权限——不多也不少。一旦线程创建完网页,它就会“恢复”回原始帐户并为下一次调用做好准备。此技术用于访问只有登录到您网站的用户才能访问的资源。坚持这个概念一分钟。

现在,默认情况下 ASP.NET 在名为的本地帐户下运行一个网站 ASP网络. 。同样,默认情况下,只有 ASPNET 帐户和管理员组的成员才能写入该文件夹。您的临时文件夹位于该帐户的权限之下。这是拼图的第二块。

冒充行为不会自行发生。它需要在您的 web.config 中有意打开。

<identity impersonate="true" />

如果该设置丢失或设置为 false,您的代码将在上述 ASPNET 帐户下纯粹执行。鉴于您的错误消息,我确信您有impersonation=true。没有什么不妥!模仿的优点和缺点超出了本文的讨论范围。

还剩下一个问题:当你使用模仿时, 哪个帐户被冒充?

除非您在 web.config 中指定帐户(单位元素的完整语法在这里),所模拟的帐户是IIS交给ASP.NET的帐户。这取决于用户如何通过(或未)验证进入网站。这是你的第三件也是最后一件作品。

IUSR_ComputerName 帐户是 IIS 创建的低权限帐户。默认情况下,该帐户是网络呼叫运行的帐户 如果用户无法通过身份验证. 。也就是说,用户以“匿名”身份出现。

总而言之,这就是您正在发生的事情:

您的用户正在尝试访问该网站,但 IIS 由于某种原因无法验证该用户的身份。由于匿名访问处于打开状态(否则您不会看到 IUSRComputerName 访问临时文件夹),因此 IIS 无论如何都允许该用户,但作为一般用户。您的 ASP.NET 代码运行并模拟此通用 IUSR___ComputerName“来宾”帐户;只是现在代码无法访问 ASPNET 帐户有权访问的内容,包括其自己的临时文件夹。

授予 IUSR_ComputerName 对该文件夹的 WRITE 访问权限可以使您的症状消失。

但这只是症状。你需要回顾一下 为什么此人以“匿名/访客”身份出现?

有两种可能的情况:

a) 您打算使用 IIS 进行身份验证,但某些服务器的 IIS 中的身份验证设置是错误的。

在这种情况下,您需要在这些服务器上禁用匿名访问,以便进行通常的身份验证机制。请注意,您可能仍需要向用户授予对该临时文件夹的访问权限,或者使用用户已有权访问的另一个文件夹。

我已经多次处理过这种情况,坦率地说,放弃 Temp 文件夹可以让您减少一些麻烦;在服务器中创建一个专用文件夹,设置适当的权限,并在 web.config 中设置其位置。

b) 您无论如何都不想对人员进行身份验证,或者您想使用 ASP.NET 表单身份验证(它使用 IIS 的匿名访问来绕过 IIS 中的检查,并让 ASP.NET 直接处理身份验证)

这个案例有点复杂。

您应该转到 IIS 并禁用除“匿名访问”之外的所有形式的身份验证。请注意,您无法在开发人员的框中执行此操作,因为调试器需要启用集成身份验证。所以你的调试盒的行为会与真实服务器有所不同;请注意这一点。

然后,您需要决定是否应该关闭模拟,或者相反,在 web.config 中指定要模拟的帐户。如果您的 Web 服务器不需要外部资源(例如数据库),请执行第一个操作。如果您的网站确实需要在有权访问数据库(或其他外部资源)的帐户下运行,请执行后者。

您还有另外两种选择来指定要模拟的帐户。第一,您可以转到 IIS 并将“匿名”帐户更改为有权访问资源的帐户,而不是 IIS 为您管理的帐户。第二种选择是将加密的帐户和密码存储在注册表中。该步骤有点复杂,也超出了本讨论的范围。

祝你好运!

其他提示

可能是因为 IIS_WPG 无法访问临时文件夹。如果您认为这是权限问题,请运行 普罗克蒙 在 asp.net 工作进程上并检查 AccessDenied 错误。

我在诊断写入临时文件的控制台应用程序时遇到此错误。在我的一次测试迭代中,我清除了 temp 中的所有文件/目录以进行“全新”运行。我通过注销并重新登录解决了这个自我造成的问题。

您可以使用 路径.GetTempPath() 找出它试图写入哪个目录。

我的 ASP.Net 应用程序之一也遇到了同样的问题。我正在得到 路径.GetTempPath() 但它抛出了一个异常:

“无法写入文件“C:\Windows emp\somefilename”,异常:对路径“C:\Windows emp\somefilename”的访问被拒绝。”

我在此页面上尝试了一些建议,但没有任何帮助。

最后,我进入了Web服务器(IIS服务器)并更改了服务器“C:\Windows emp”目录的权限,为“Everyone”用户提供了完全的读写权限。

最后,异常消失了,我的用户可以从应用程序下载文件。唷!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top