中信任文件 I/O 权限

Posted

技术标签:

【中文标题】中信任文件 I/O 权限【英文标题】:Medium-Trust File I/O permission 【发布时间】:2011-03-08 18:25:27 【问题描述】:

据此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 帐户,然后检查 所需访问权限的框。

来源错误:

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

堆栈跟踪:

[未授权访问异常:访问 到路径 'C:\WebSites\mywebsite\myfile.xml' 是 拒绝。] System.IO.__Error.WinIOError(Int32 错误代码,字符串可能是FullPath) +12892935 System.IO.FileStream.Init(字符串路径, FileMode 模式,FileAccess 访问, Int32 权限,布尔用户权限, FileShare 共享,Int32 bufferSize, 文件选项选项, SECURITY_ATTRIBUTES secAttrs,字符串 msgPath,布尔值 bFromProxy,布尔值 使用长路径)+2481 System.IO.FileStream..ctor(字符串 路径、FileMode 模式、FileAccess 访问、文件共享共享、Int32 bufferSize,FileOptions 选项, 字符串 msgPath,布尔 bFromProxy) +229 System.IO.FileStream..ctor(字符串 路径、FileMode 模式、FileAccess 访问、文件共享共享)+102 System.Xml.XmlWriterSettings.CreateWriter(字符串 输出文件名) +5224496 System.Xml.Linq.XElement.Save(字符串 文件名,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 应用程序)+3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext 上下文, MethodInfo[] 处理程序)+191 System.Web.HttpApplication.InitSpecial(HttpApplicationState 状态,MethodInfo[] 处理程序,IntPtr appContext、HttpContext 上下文)+325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext、HttpContext 上下文)+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 上下文)+4782309

【问题讨论】:

请显示完整的堆栈跟踪和异常消息。不清楚这是 CAS (CLR) 安全异常还是 NTFS 文件权限问题。 @Elion - 更新完全错误。 您使用的是什么版本的 IIS?是否有任何其他进程可能会锁定 myfile.xml 文件? IIS 7.5,我在一个共享主机上,除了我的 Web 应用程序之外没有其他进程应该使用它,它可以被多个用户访问,但不能被编辑。 【参考方案1】:

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

网络目录/数据 webdir/data/myfile.xml

webdir/wwwroot webdir/wwwroot/default.aspx

【讨论】:

是否有读/写文件而不必确保权限存在?我的意思是,如果我的应用程序旨在创建需要读/写访问权限的新文件,而我的用户不精通技术,有没有办法解决这个问题? 我在这里找到了一些关于设置文件权限的信息 (experts-exchange.com/Web_Development/Miscellaneous/…) 或者只是 Google asp.net set file permissions【参考方案2】:

您的 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?

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

Medium Trust 指定应用程序只能访问 $AppDir。您可以通过更改 FileIOPermission 以包含除 $AppDir 之外的其他目录来自定义中等信任级别以添加对中等信任的额外访问。但是,我发现即使在自定义的中等信任级别下调用 Server.MapPath("/") 时,也会出现异常“Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version= 4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 失败”

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

【讨论】:

【参考方案5】:

我在 GoDaddy 上建立了一个网站,发现我可以启用写访问的唯一方法是为 整个网络根 启用它,但这可能只是该托管计划的限制?

【讨论】:

以上是关于中信任文件 I/O 权限的主要内容,如果未能解决你的问题,请参考以下文章

中信任的 ASP.NET MVC

苹果6的信任功能在哪里设置

burpsuite iphone 手机抓包

标准I/O与管道;用户组和权限;文件处理工具及正则表达式总结

苹果手机怎么查看可信任的证书

NIST建议的零信任安全8大应用场景