遇到问题,在某些服务器上,当使用Path.GetTempFileName时,我们会收到目录名无效的错误.进一步调查显示它正在尝试将文件写入c:\ Documents和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中有意打开.
如果设置丢失或设置为false,您的代码将在上面提到的ASPNET帐户下执行pure.鉴于您的错误消息,我肯定您有impersonation = true.没有什么不妥!模仿的优点和缺点超出了本次讨论的范围.
还有一个问题:当您使用模拟时,哪个帐户会被假冒?
除非您在web.config中指定帐户(此处为identity元素的完整语法),否则模拟的帐户是IIS移交给ASP.NET的帐户.这取决于用户如何对网站进行身份验证(或不进行身份验证).那是你的第三部也是最后一部.
IUSR_ComputerName帐户是IIS创建的低权限帐户.默认情况下,如果无法对用户进行身份验证,则此帐户是运行Web呼叫的帐户.也就是说,用户以"匿名"身份进入.
总之,这就是你发生的事情:
您的用户正在尝试访问该网站,并且IIS无法出于某种原因对该人进行身份验证.因为匿名访问是ON,(或者您不会看到IUSRComputerName访问临时文件夹),IIS无论如何都允许用户,但作为通用用户.您的ASP.NET代码运行并模拟此通用IUSR___ComputerName"guest"帐户; 只是现在代码无法访问ASPNET帐户有权访问的内容,包括自己的临时文件夹.
授予对该文件夹的IUSR_ComputerName WRITE访问权限会使您的症状消失.
但那只是症状.你需要回顾为什么这个人会成为"匿名/来宾"?
有两种可能的情况:
a)您打算使用IIS进行身份验证,但IIS中某些服务器的身份验证设置是错误的.
在这种情况下,您需要在这些服务器上禁用匿名访问,以便进行常规的身份验证机制.请注意,您可能仍需要向用户授予对该临时文件夹的访问权限,或者使用另一个文件夹,即用户已有权访问的文件夹.
我已经多次使用过这个场景了,坦率地说,它让你不用担心放弃Temp文件夹; 在服务器中创建一个专用文件夹,设置适当的权限,并在web.config中设置其位置.
b)您无论如何都不想对人进行身份验证,或者您希望使用ASP.NET Forms身份验证(使用IIS的匿名访问来绕过IIS中的检查并允许ASP.NET直接处理身份验证)
这种情况有点复杂.
您应该转到IIS并禁用"匿名访问"以外的所有形式的身份验证.请注意,您无法在开发人员的框中执行此操作,因为调试器需要启用集成身份验证.因此,您的调试框将与真实服务器的行为略有不同; 只是意识到这一点.
然后,您需要决定是否应该关闭模拟,或者相反,指定要在web.config中模拟的帐户.如果您的Web服务器不需要外部资源(如数据库),请执行第一步.如果您的网站确实需要在可以访问数据库(或其他一些外部资源)的帐户下运行,请执行后者.
您还有两个选项可以指定要模拟的帐户.一,您可以转到IIS并将"匿名"帐户更改为可访问资源的帐户,而不是IIS为您管理的帐户.第二种方法是存储在注册表中加密的帐户和密码.这一步有点复杂,也超出了本讨论的范围.
祝好运!