这可能是假冒和不同身份验证方法不匹配的组合。
有很多件;我将尝试一一检查。
模拟是一种“临时”切换线程正在运行的用户帐户的技术。从本质上讲,该线程短暂地获得了与被模拟的帐户相同的权限和访问权限——不多也不少。一旦线程完成创建网页,它就会“恢复”回原始帐户并为下一次调用做好准备。此技术用于访问只有登录到您网站的用户才能访问的资源。坚持这个概念一分钟。
现在,默认情况下 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 为您管理的帐户。第二种选择是将加密的帐户和密码存储在注册表中。这一步有点复杂,也超出了本次讨论的范围。
祝你好运!