gpt4 book ai didi

c# - Path.GetTempFileName-目录名称无效

转载 作者:太空狗 更新时间:2023-10-29 17:34:46 24 4
gpt4 key购买 nike

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

最佳答案

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

有很多东西;我会尝试一个接一个地检查它们。

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

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

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

<identity impersonate="true" />

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

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

除非您在web.config( full syntax of the identity element here)中指定该帐户,否则模拟的帐户就是IIS移交给ASP.NET的帐户。而这取决于用户如何验证(或未验证)网站的身份。这是您的第三篇也是最后一篇。

IUSR_ComputerName帐户是由IIS创建的低权限帐户。默认情况下,如果无法通过身份验证用户,则此帐户是网络调用用于运行 的帐户。即,用户以“匿名”身份进入。

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

您的用户正在尝试访问该网站,并且IIS由于某种原因无法对该人进行身份验证。因为启用了匿名访问,(否则您将看不到IUSRComputerName访问临时文件夹),所以IIS无论如何都允许该用户,但它是普通用户。您的ASP.NET代码将运行并模拟该通用IUSR___ComputerName“ guest ”帐户;直到现在,该代码都无法访问ASPNET帐户有权访问的内容,包括其自己的临时文件夹。

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

但这仅仅是症状。您需要查看,为什么这个人以“匿名/ guest ”身份出现?

有两种可能的情况:

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

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

我已经在这种情况下工作了很多次,坦率地说,它使您减少了Temp文件夹的麻烦。在服务器中创建一个专用文件夹,设置适当的权限,然后在web.config中设置其位置。

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

这种情况有点复杂。

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

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

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

祝你好运!

关于c# - Path.GetTempFileName-目录名称无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com