中等信任文件I / O权限

时间:2010-06-27 03:51:07

标签: asp.net file-io medium-trust

根据这个MSDN article about medium trust,在中等信任下:

  

FileIOPermission受到限制。这个   意味着你只能访问文件   应用程序的虚拟目录   层次结构。您的申请被授予   读,写,追加和路径发现   您的应用程序的权限   虚拟目录层次结构。

但是,对于我当前的托管服务提供商在中等信任下运行应用程序,当我尝试在应用程序的根文件夹中读取/写入文件时,出现access to path 'myfile.xml' denied错误。

使用以下代码

读取此文件
XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));

更新完整错误:

  

访问路径   'C:\ WebSites \ mywebsite \ myfile.xml'是   拒绝。

     

描述:未处理的异常   在执行期间发生   当前的网络请求。请查看   堆栈跟踪以获取更多信息   错误及其来源   代码。

     

异常详细信息:   System.UnauthorizedAccessException的:   访问路径   'C:\ WebSites \ mywebsite \ myfile.xml'是   否认。

     

ASP.NET无权访问   请求的资源。考虑   授予对资源的访问权限   到ASP.NET请求标识。   ASP.NET具有基本进程标识   (通常是IIS 5上的{MACHINE} \ ASPNET   或IIS 6和IIS 7上的网络服务,   和配置的应用程序池   IIS 7.5上的标识,如果使用的话   该申请不是冒充。   如果申请是假冒的   通过,   身份将是匿名的   用户(通常是IUSR_MACHINENAME)或   经过身份验证的请求用户。

     

要授予对文件的ASP.NET访问权限,   在资源管理器中右键单击该文件,   选择“属性”并选择   安全选项卡。单击“添加”以添加   适当的用户或组。突出   ASP.NET帐户,并检查   用于所需访问的框。

     

来源错误:

     

生成了未处理的异常   在执行当前   网络请求。有关的信息   异常的起源和位置   可以使用例外来识别   堆栈跟踪下面。

     

堆栈追踪:

     

[UnauthorizedAccessException:Access   到了路上   'C:\ WebSites \ mywebsite \ myfile.xml'是   否认。]
  System.IO .__ Error.WinIOError(的Int32   errorCode,String maybeFullPath)   +12892935 System.IO.FileStream.Init(String path,   FileMode模式,FileAccess访问,   Int32权限,布尔值使用权限,   FileShare共享,Int32 bufferSize,   FileOptions选项,   SECURITY_ATTRIBUTES secAttrs,String   msgPath,Boolean bFromProxy,Boolean   useLongPath)+2481
  System.IO.FileStream..ctor(字符串   path,FileMode模式,FileAccess   访问,FileShare共享,Int32   bufferSize,FileOptions选项,   String msgPath,Boolean bFromProxy)   +229 System.IO.FileStream..ctor(String   path,FileMode模式,FileAccess   访问,FileShare分享)+102
  System.Xml.XmlWriterSettings.CreateWriter(字符串   outputFileName)+5224496
  System.Xml.Linq.XElement.Save(字符串   fileName,SaveOptions选项)+108
  mesoBoard.Services.SiteConfig.UpdateCache()   +1971 mesoBoard.Web.MvcApplication.OnApplicationStarted()   +62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start()   604

     

[HttpException(0x80004005):访问   路径   'C:\ WebSites \ mywebsite \ myfile.xml'是   否认。]
  System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext的   上下文,HttpApplication app)+3985477   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr的   appContext,HttpContext上下文,   MethodInfo []处理程序)+191
  System.Web.HttpApplication.InitSpecial(HttpApplicationState   state,MethodInfo []处理程序,IntPtr   appContext,HttpContext context)+325   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr的   appContext,HttpContext context)+407   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr的   appContext)+375

     

[HttpException(0x80004005):访问   路径   'C:\ WebSites \ mywebsite \ myfile.xml'是   否认。]
  System.Web.HttpRuntime.FirstRequestInit(HttpContext的   上下文)+11524352
  System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext的   上下文)+141
  System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest   wr,HttpContext context)+4782309

5 个答案:

答案 0 :(得分:1)

您需要确保运行网站的应用程序池的用户帐户具有对文件/文件夹的读/写权限。默认情况下,我认为您应该具有读取权限但不具有写入权限。此外,出于安全原因,将该文件从wwwroot文件夹中移出到不会损坏整个应用程序的内容中可能是个好主意。

  

WEBDIR /数据
  webdir / data / myfile.xml

     

WEBDIR / wwwroot的
  WEBDIR / wwwroot的/ Default.aspx的

答案 1 :(得分:0)

您的IO权限听起来好像只是您的文件的权限问题。我知道每当我将文件上传到我的托管服务提供商时,我都必须登录他们的控制面板并手动授予IIS帐户写入权限,因为读访问权是唯一自动授予的权限。

另一方面,xml文件的位置存在安全问题。尝试将文件放在“〜/ App_Data /”文件夹中,这是一个比数据文件夹更受限制的特殊.NET文件夹 - 目前我可以访问www.yoursite.com/data/myfile.xml并下载它,而App_Data文件夹中的任何文件都无法通过网络下载。

What is the App_Data folder used for in Visual Studio?

答案 2 :(得分:0)

您正在使用XElement类。您的托管“中级”配置中可能不允许使用名称空间“System.Xml.Linq”。要在中级信任中使用Linq,请遵循以下procedure

答案 3 :(得分:0)

Medium Trust指定应用程序只能访问$ AppDir。您可以通过更改FileIOPermission以包含除$ AppDir之外的其他目录来自定义介质信任级别以添加对介质信任的其他访问。但是,我发现当您甚至在自定义的中等信任级别下调用Server.MapPath(" /")时,您将获得一个例外"请求获得类型'的许可。 System.Security.Permissions.FileIOPermission,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'失败"

我的理论是,这是因为您要求访问$ AppDir"之外的文件系统。我们最终必须从Web应用程序中删除对Server.MapPath()的所有调用。

答案 4 :(得分:-1)

我在GoDaddy上建立了一个网站,发现我能够启用写入权限的唯一方法就是为整个网络根启用它,但这可能只是对该​​主机方案的限制?