Path.GetTempFileName-目录名称无效

时间:2020-03-05 18:51:06  来源:igfitidea点击:

在使用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"访问权限可以解决问题。那是正确的程序吗?我似乎不记得过去这样做过,显然,我想遵循最佳实践来维护安全性。毕竟,这是文件上传过程的一部分。

解决方案

回答

我们可以使用Path.GetTempPath()找出要尝试写入的目录。

回答

可能是因为IIS_WPG无法访问临时文件夹。如果我们认为这是权限问题,请在asp.net worker进程上运行Procmon并检查AccessDenied错误。

回答

这可能是模拟和发生的不同身份验证方法不匹配的组合。

有很多东西;我会尽力一步一步地解决它们。

模拟是一种"临时"切换运行线程的用户帐户的技术。本质上,该线程短暂地获得与被模拟的帐户相同的权限和访问权限-不能多也不能少。一旦线程完成了网页的创建,它就会"还原"回原始帐户并为下一次调用做好准备。此技术用于访问只有登录到网站的用户才能访问的资源。稍等片刻。

现在,默认情况下,ASP.NET在名为ASPNET的本地帐户下运行网站。同样,默认情况下,只有ASPNET帐户和Administrators组的成员才能写入该文件夹。临时文件夹在该帐户的权限下。这是难题的第二部分。

冒名顶替不会单独发生。需要在web.config中有意将其打开。

<identity impersonate="true" />

如果缺少该设置或者将其设置为false,则代码将纯粹在上述ASPNET帐户下执行。鉴于错误消息,我很肯定模拟为true。没有什么不妥!模拟的优点和缺点超出了此讨论范围。

剩下一个问题:当我们使用模拟功能时,哪个帐户会被模拟?

除非我们在web.config中指定帐户(此处为identity元素的完整语法),否则模拟的帐户是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为我们管理的帐户。第二种选择是将帐户和密码存储在注册表中。该步骤有点复杂,并且超出了本讨论的范围。

祝你好运!