2008-09-10 207 views
9

遇到一个问题,在某些服务器上,当使用Path.GetTempFileName时,会出现目录名称无效的错误。进一步的调查显示它正试图将文件写入c:\ Documents and Setting \ computername \ aspnet \ local settings \ temp(通过使用Path.GetTempPath找到)。此文件夹存在,所以我假设这必须是关于asp.net帐户的权限问题。Path.GetTempFileName - 目录名称无效

有人告诉我,Path.GetTempFileName应该指向C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ temporaryasp.net文件。

我也被告知,这个问题可能是由于在服务器上安装IIS和.NET的顺序。我已经完成了典型的'aspnet_regiis -i'并检查了文件夹中的安全等。在这一点上我卡住了。

任何人都可以对此有所了解吗?

**更新:**原来,提供'IUSR_ComputerName'访问该文件夹的技巧。这是正确的程序吗?我似乎没有回想过去那样做,显然,我们想要遵循最佳实践来维护安全。毕竟,这是文件上传过程的一部分。

回答

17

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

有很多件;我会试着一个接一个地过去。

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

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

冒充不会自行发生。它需要在你的web.config中有意打开。

<identity impersonate="true" /> 

如果设置丢失或设置为false,那么您的代码将在上述ASPNET帐户下执行纯粹且简单的操作。鉴于你的错误信息,我确信你有模拟=真实。没有什么不妥!假冒的优点和缺点超出了这个讨论范围。

还有一个问题:当你使用模拟,哪个帐号被冒充

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

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

总之,这是发生了什么事给你:

您的用户试图访问该网站,和IIS无法验证某些原因的人。由于匿名访问为ON(或者您不会看到IUSRComputerName访问临时文件夹),因此IIS允许用户以任何方式访问,但是以普通用户身份访问。您的ASP.NET代码将运行并模拟此通用IUSR___计算机名“guest”帐户;只有现在,代码才能访问ASPNET帐户有权访问的内容,包括其自己的临时文件夹。

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

但这只是症状。您需要查看为什么这个人会以“匿名/访客”的身份来访问?

有两种可能的情况:

一)你打算使用IIS进行身份验证,但IIS身份验证设置为你的一些服务器是错误的。

在这种情况下,您需要禁用这些服务器上的匿名访问权限,以便执行通常的身份验证机制。请注意,您可能仍然需要授予您的用户对该临时文件夹的访问权限,或者使用其他文件夹,而不是您的用户已有权访问的文件夹。

我已经多次与这个场景合作过了,坦率地说,它让你减少了放置Temp文件夹的麻烦;在服务器中创建一个专用文件夹,设置适当的权限,并在web.config中设置其位置。

b)你并不想反正认证的人,或者你想使用ASP.NET窗体身份验证(使用IIS的匿名访问绕过检查在IIS和ASP.NET可以直接处理认证)

这种情况有点复杂。

您应该转到IIS并禁用“匿名访问”以外的所有形式的身份验证。请注意,您不能在开发人员的方框中执行此操作,因为调试器需要启用集成身份验证。所以你的调试盒会比真实的服务器表现得有点不同;请注意这一点。

然后,您需要决定是关闭模拟还是反过来指定要在web.config中模拟的帐户。如果您的Web服务器不需要外部资源(如数据库),请首先执行操作。如果您的网站确实需要在可访问数据库(或其他外部资源)的帐户下运行,请执行后者。

您有另外两种替代方法来指定要模拟的帐户。一,你可以去IIS并将“匿名”帐户改为可以访问资源的帐户,而不是IIS管理的帐户。第二种选择是隐藏在注册表中加密的帐户和密码。这一步有点复杂,也超出了本次讨论的范围。

祝你好运!

0

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

2

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

0

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

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

我在这个页面上试了一些建议,但没有什么帮助。最后,我进入了Web服务器(IIS服务器)并更改了服务器的“C:\ Windows \ Temp”目录中的权限,为“Everyone”用户提供了完全的读写权限。

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

0

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