【问题标题】:Why can't my ASPX pages access directories on the webserver iteself?为什么我的 ASPX 页面不能访问 Web 服务器本身的目录?
【发布时间】:2010-12-13 18:49:32
【问题描述】:

我有一个 Web 客户端,它以 XML 的形式向我的 Web 服务器发送请求。 Web 服务器创建一个(相当大的)文件并将其保存在缓存目录中,并通过响应流将其返回给 Web 客户端。这在我尝试的前几次运行良好,但突然停止工作并报告以下异常(包装在 XML 中):

<error type="System.Security.SecurityException">
  <message>Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.</message>
  <stack-trace><![CDATA[   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.CodeAccessPermission.Demand()
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode)
   at Ionic.Zip.SharedUtilities.CreateAndOpenUniqueTempFile(String dir, Stream& fs, String& filename)
   at Ionic.Zip.ZipFile.get_WriteStream()
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at MyApplication.UpdateItemFiles.GetUpdateContent(XDocument a_xManifest, Stream[] a_arrExtraContent) in C:\Software\MyApplication\Alpha\Web Interface\UpdateItemFiles.aspx.cs:line 265
   at MyApplication.UpdateItemFiles.Page_Load(Object sender, EventArgs e) in C:\Software\MyApplication\Alpha\Web Interface\UpdateItemFiles.aspx.cs:line 31]]></stack-trace>
</error>

我对代码访问安全性了解不多。我什至尝试将目录的完全控制权交给每个人。这不是问题,因为这是开发服务器而不是公共机器。我不明白为什么这会在前几次有效,但现在停止工作。

我在 Windows 7 64 位上为服务器和客户端(它们是同一台机器)使用 Visual Studio 2008。我正在使用 IIS 7.0 和 .Net Framework 3.5。

2010/12/13 16:05 EST 编辑:

我收到此错误是因为我使用的是 Codeplex 的 DotNetZip 库。有没有办法将程序集添加到 IIS 或我的配置中?

【问题讨论】:

  • 让我猜猜,我“应该”使用 SQL Server,对吧?

标签: asp.net webclient code-access-security


【解决方案1】:

我建议不要修改 ASP.NET 应用程序用户本身的安全设置,而是创建一个新的文件访问应用程序(可能是通过远程处理访问的 Windows 服务,也可能是 WCF)来进行文件访问。此应用程序可以使用文件访问所需的上下文运行。

ASP.NET 应用程序只需要能够与文件访问应用程序通信。这样一来,您的顾虑被分离出来,安全性更强,您不必担心 ASP.NET 应用正在使用什么帐户,或者冒充用户等。

【讨论】:

  • 除了,我对远程处理或 WCF 一无所知。
  • 花点时间学习是值得的。即使您没有深入了解,任何优秀的企业应用程序都有一个服务层,而 WCF 似乎是 .NET 远程处理的发展方向。在短期内,尝试在谷歌上搜索一个 .NET 远程处理“hello world”应用程序——创建一个应用程序不需要很多东西——只需要在 app.config 中为客户端和服务器添加几个类和几行代码。
  • 我寻求这条路,但被拒绝了。我找到了一个丑陋但有效的解决方案。我最喜欢这个答案,即使我没有使用它。我的解决方案如下。
【解决方案2】:

因为您的网站正在运行的用户默认拥有非常少的权限。你最好的选择是

  1. 使用您需要的权限创建一个新用户 - 访问 SQL、某些文件夹等。
  2. 将您的应用程序设置为以该用户身份运行
  3. 在 web.config 中启用模拟

这样,您可以将 privs 的更改保留在您的应用程序本地,并避免与默认用户在同一服务器上运行的其他应用程序的安全问题。

【讨论】:

  • 这不起作用。可能是因为我使用的是 IIS 7.0。我阅读了有关匿名用户 IUSR_COMPUTERNAME 的文档。我没有这个用户。
【解决方案3】:

问题在于我用来创建 Zip 档案的程序集 Iconic.Zip。 IIS 服务器不信任它,因此它没有通过代码访问安全检查。我的解决方案是从我自己的代码中创建流。这样做的缺点是,在保存存档之前,我必须让流保持打开状态,因为 ZipFile 类型一次完成所有的读取和写入。

【讨论】:

    猜你喜欢
    • 2022-07-28
    • 2015-11-26
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2015-06-23
    • 2012-07-29
    相关资源
    最近更新 更多