Path.GetTempFileName -- 目录名无效

10
在某些服务器上使用Path.GetTempFileName时出现目录名无效的错误。进一步调查发现,它试图将文件写入c:\Documents and Setting\computername\aspnet\local settings\temp(使用Path.GetTempPath找到)。该文件夹存在,因此我认为这必须是与asp.net帐户相关的权限问题。
有些人告诉我,Path.GetTempFileName应该指向C:\Windows\Microsoft.NET\Framework\v2.0.50727\temporaryasp.net文件。
我也被告知,这个问题可能是由于IIS和.NET在服务器上安装的顺序不同导致。我已经执行了典型的“aspnet_regiis-i”操作,并检查了文件夹的安全性等。目前我陷入困境。
有人能解决这个问题吗?
**更新:**结果证明,为'IUSR_ComputerName'提供对文件夹的访问权限可以解决问题。那么这是正确的程序吗?我似乎不记得以前这样做过,显然要遵循最佳实践来维护安全性。毕竟,这是文件上传过程的一部分。
5个回答

18
这可能是模拟和不同身份验证方法不匹配的组合问题。
有许多因素; 我将逐一介绍它们。
"模拟"是一种技术,可以“暂时”切换线程正在运行的用户帐户。实质上,该线程短暂地获得与被模拟的帐户相同的权限和访问权限-没有更多,也没有更少。线程完成创建网页后,它会“恢复”到原始帐户并准备好下一次调用。此技术用于访问仅限于登录到您的网站的用户的资源。请稍等一分钟,理解这个概念。
现在,默认情况下,ASP.NET在名为ASPNET的本地帐户下运行网站。同样,默认情况下,只有ASPNET帐户和管理员组的成员才能写入该文件夹。您的临时文件夹位于该帐户的监管之下。这是谜题的第二部分。
模拟不会自动发生。您需要在web.config中有意打开它。
<identity impersonate="true" />

如果设置缺失或设置为false,则您的代码将在上述ASPNET帐户下纯粹执行。根据您的错误消息,我确定您启用了模拟功能(impersonation=true)。这样做没有问题!模拟具有优点和缺点,超出本讨论范围。
还有一个问题:当您使用模拟功能时,哪个帐户被模拟?
除非您在web.config中指定帐户(此处为identity元素的完整语法),否则模拟的帐户是IIS交给ASP.NET的帐户。这取决于用户如何进行身份验证(或未经身份验证)进入站点。这是您的第三个和最后一个要素。
IUSR_ComputerName帐户是由IIS创建的低权限帐户。默认情况下,如果无法对用户进行身份验证,则该帐户是Web调用运行的帐户。也就是说,用户作为“匿名”用户登录。
总之,以下是发生在您身上的情况:
您的用户正在尝试访问网站,但IIS出于某种原因无法对该人进行身份验证。由于匿名访问已开启(否则您不会看到IUSRComputerName访问临时文件夹),IIS仍然允许该用户进入,但作为通用用户。您的ASP.NET代码运行并模拟此通用IUSR___ComputerName“guest”帐户;现在代码无法访问ASPNET帐户具有访问权限的内容,包括其自己的临时文件夹。
授予IUSR_ComputerName对该文件夹的写入权限可以解决您的问题。
但那只是症状,你需要审查“为什么这个人以“匿名/访客”的身份出现”的原因?
有两种可能的情况:
a) 你打算使用IIS进行身份验证,但某些服务器上的身份验证设置错误。
在这种情况下,您需要在这些服务器上禁用匿名访问,以便进行通常的身份验证机制。请注意,您可能仍然需要授予用户对该临时文件夹的访问权限,或者使用另一个具有用户已经拥有访问权限的文件夹。
我经常遇到这种情况,并且坦率地说,如果放弃Temp文件夹并创建一个专用文件夹,在服务器上设置适当的权限并将其位置设置在web.config中,会给您带来更少的麻烦。
b) 您根本不想认证用户,或者您想使用ASP.NET Forms身份验证(它使用IIS的匿名访问来绕过IIS中的检查,并直接让ASP.NET处理身份验证)
这种情况有点复杂。
您应该前往IIS并禁用除“匿名访问”之外的所有身份验证形式。请注意,您无法在开发人员的计算机上执行此操作,因为调试器需要启用集成身份验证。因此,您的调试框将与实际服务器的行为有所不同;请注意这一点。
然后,您需要决定是关闭模拟身份还是相反,在web.config中指定要模拟的帐户。如果您的Web服务器不需要外部资源(例如数据库),请执行第一个选项。如果您的网站确实需要在具有对数据库(或其他外部资源)访问权限的帐户下运行,请执行后者。
你有两种选择来指定要模拟的帐户。一种是去IIS并将“匿名”帐户更改为具有访问资源权限的帐户,而不是IIS为您管理的帐户。第二个选择是将帐户和密码加密存储在注册表中。这一步有点复杂,超出了本讨论的范围。
祝好运!

3

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


2
可能是因为 IIS_WPG 没有访问临时文件夹的权限。如果您认为这是权限问题,请在 asp.net 工作进程上运行 Procmon 并检查 AccessDenied 错误。

1
我在我的ASP.Net应用程序中遇到了同样的问题。我得到了Path.GetTempPath(),但它抛出了以下异常:
"无法写入文件"C:\Windows\Temp\somefilename",异常:拒绝访问路径"C:\Windows\Temp\somefilename"。
我在这个页面上尝试了一些建议,但没有什么帮助。
最后,我进入了Web服务器(IIS服务器),并更改了服务器的"C:\Windows\Temp"目录上的权限,以使"Everyone"用户具有完全的读写权限。
最后,异常消失了,我的用户可以从应用程序下载文件。 呼~~

0
你可以使用 Path.GetTempPath() 来查找它试图写入的目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接