0

我有一个 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 编辑:

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

4

3 回答 3

1

因为默认情况下,您的网站运行的用户具有非常少的权限。你最好的选择是

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

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

于 2010-12-13T18:51:57.343 回答
1

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

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

于 2010-12-13T18:56:47.310 回答
0

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

于 2010-12-15T14:06:48.100 回答