带有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?的主要内容,如果未能解决你的问题,请参考以下文章
c#中response.writeFile语句打开word显示乱码
PHP PharData:从目录构建 .tar 存档,带有排除项
如何选择所有子文本但不包括带有 Scapy 的 XPath 的标签?