为什么我的ASPX页面不能访问Web服务器本身的目录?

时间:2010-12-13 18:49:33

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

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

我对Code Access Security了解不多。我甚至试图完全控制目录给每个人。这不是问题,因为这是开发服务器而不是公共机器。我不明白为什么这会在前几次工作,但现在就停止工作了。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

    通过这种方式,您可以对应用本地的privs进行更改,并避免与默认用户在同一服务器上运行的其他应用程序出现安全问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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