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

4

5 回答 5

18

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

有很多件;我将尝试一一检查。

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

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

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

<identity impersonate="true" />

如果该设置缺失或设置为 false,您的代码将在上述 ASPNET 帐户下纯粹且简单地执行。鉴于您的错误消息,我很肯定您有 impersonation=true。没有什么不妥!模仿具有超出此讨论范围的优点和缺点。

剩下一个问题:当您使用模拟时,哪个帐户会被模拟

除非您在 web.config 中指定帐户(此处为标识元素的完整语法),否则模拟的帐户是 IIS 移交给 ASP.NET 的帐户。这取决于用户如何通过身份验证(或不通过身份验证)进入该站点。那是你的第三个也是最后一个作品。

IUSR_ComputerName 帐户是由 IIS 创建的低权限帐户。默认情况下,如果用户无法通过身份验证,则此帐户是运行 Web 呼叫的帐户。也就是说,用户以“匿名”身份进入。

总之,这就是发生在你身上的事情:

您的用户正在尝试访问该网站,而 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 为您管理的帐户。第二种选择是将加密的帐户和密码存储在注册表中。这一步有点复杂,也超出了本次讨论的范围。

祝你好运!

于 2008-09-13T05:56:29.970 回答
2

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

于 2008-09-10T22:18:26.547 回答
2

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

于 2017-07-25T18:00:01.183 回答
0

您可以使用Path.GetTempPath()找出它试图写入的目录。

于 2008-09-10T22:15:58.067 回答
0

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

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

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

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

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

于 2013-02-07T09:44:31.693 回答