带有Response.WriteFile但不带有File.Copy的ASP.NET登录失败IOException?

Posted

技术标签:

【中文标题】带有Response.WriteFile但不带有File.Copy的ASP.NET登录失败IOException?【英文标题】:ASP.NET Logon Failure IOException with Response.WriteFile but not with File.Copy? 【发布时间】:2009-09-21 18:36:01 【问题描述】:

我正在尝试将文件发送到位于远程主机上的浏览器(通过 UNC)。

Web 应用程序在模拟和应用程序池下运行,用户对远程主机的 UNC 目录具有完全访问权限(通过匹配的凭据)。

我可以使用 System.IO 对象的 File.Copy 在 UNC 路径上毫无问题地读取和写入文件。但是,当我尝试

  Dim file As System.IO.FileInfo = New System.IO.FileInfo([UNCFilePath])
  Response.Clear()
  Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name.Replace(" ", "_"))
  Response.AddHeader("Content-Length", file.Length.ToString())
  Response.ContentType = "application/octet-stream"
  Response.WriteFile(file.FullName)

我明白了

System.IO.IOException: Logon failure: unknown user name or bad password

如果我通过 File.CopyTo 将文件复制到本地目录并从那里执行 writefile,它就可以工作。

除了这个问题的解决方案之外,我的主要问题是为什么 File.Copy 有效而 File.Response 无效?他们不是都在使用 System.IO 吗?

【问题讨论】:

【参考方案1】:

我建议在目标框上启用安全事件日志记录。哪些帐户在通信中起作用并不总是很清楚。在这种情况下,如果 ASPNET 计算机帐户出现在画面中,我不会感到惊讶,即使您使用的是模拟。

在 Windows XP Pro 中启用安全事件记录:

    转到控制面板 -> 管理工具 -> 本地安全策略 展开Local Policies并查看Audit Policy文件夹 双击此处的任何项目以指明需要记录的内容

您可以通过转到控制面板 -> 管理工具组并双击事件查看器图标来查看安全事件日志.

【讨论】:

【参考方案2】:

感谢大卫的帮助。这向我表明,应用程序池实际上没有在正确的凭据下运行。

我想要吸取的教训是通过 Response.WriteFile 访问远程 UNC 文件时不使用 ASP Impersonation (web.config)。相反,它使用应用程序池标识。

【讨论】:

【参考方案3】:

我的代码在 win server 2003 + iis6 中有效,但在新服务器 iis7.5 中无效。

我能够写入、列出文件夹,但不能下载,当我这样做时,我检索到“访问被拒绝”错误。

我解决了更改问题

Response.WriteFile(f.FullName));

Response.BinaryWrite(File.ReadAllBytes(f.FullName));

【讨论】:

以上是关于带有Response.WriteFile但不带有File.Copy的ASP.NET登录失败IOException?的主要内容,如果未能解决你的问题,请参考以下文章

带有空格的 JSF convertNumber 模式

c#中response.writeFile语句打开word显示乱码

PHP PharData:从目录构建 .tar 存档,带有排除项

如何选择所有子文本但不包括带有 Scapy 的 XPath 的标签?

带有 Java/Spring Boot 和 Thymeleaf 的 Google Map API 接收坐标但不创建地图

Sencha Touch 2 - 在项目中嵌入带有 xtype 的组件但不起作用