File I permiso medio de la Competencia de E / S
-
30-09-2019 - |
Pregunta
De acuerdo con esta artículo de MSDN acerca de la confianza medio , bajo medio-confianza:
FileIOPermission está restringido. Esta significa que sólo puede acceder a los archivos en directorio virtual de la aplicación jerarquía. Se autoriza su aplicación Leer, escribir, Añadir, y PathDiscovery permisos para sus aplicaciones de jerarquía de directorio virtual.
Sin embargo, para mi actual proveedor de alojamiento corre aplicaciones de bajo a mediano confianza y cuando trato de leer / escribir un archivo en la carpeta raíz de la aplicación, me sale un error de access to path 'myfile.xml' denied
.
Este archivo se lee utilizando el siguiente fragmento de código
XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));
Error de actualización completa:
El acceso a la ruta 'C: \ sitios de Internet \ misitioweb \ myfile.xml' es negado.
Descripción: Se produjo una excepción producido durante la ejecución de la solicitud Web actual. Por favor revise la Seguimiento de la pila para obtener más información acerca de el error y dónde se originó en el código.
Detalles de la excepción: System.UnauthorizedAccessException: El acceso a la ruta 'C: \ sitios de Internet \ misitioweb \ myfile.xml' es negado.
ASP.NET no está autorizado a acceder el recurso solicitado. Considerar conceder derechos de acceso a los recursos a la identidad de solicitud de ASP.NET. ASP.NET tiene una identidad de proceso de base (Normalmente {MACHINE} \ ASPNET en IIS 5 o Servicio de red en IIS 6 y IIS 7, y el grupo de aplicaciones configurado de identidad en IIS 7.5) que se utiliza si la aplicación no se está haciendo pasar. Si la aplicación se está haciendo pasar a través de, la identidad será el anonimato usuario (típicamente IUSR_MACHINENAME) o la petición del usuario autenticado.
Para conceder acceso a un archivo de ASP.NET, haga clic en el archivo en el Explorador, elija "Propiedades" y seleccione el pestaña de seguridad. Haga clic en "Añadir" para añadir el usuario o grupo adecuado. Realce la cuenta de ASP.NET, y compruebe el cajas para el acceso deseado.
Fuente de error:
fue generado una excepción no controlada durante la ejecución de la corriente solicitud web. La información relativa a la origen y la ubicación de la excepción puede ser identificado usando la excepción Seguimiento de la pila a continuación.
Seguimiento de la pila:
[UnauthorizedAccessException: Acceso a la trayectoria 'C: \ sitios de Internet \ misitioweb \ myfile.xml' es negado.]
System.IO .__ Error.WinIOError (Int32 errorCode, Cadena maybeFullPath) +12892935 System.IO.FileStream.Init (camino String, FileMode modo, el acceso FileAccess, los derechos Int32, useRights booleanas, Compartir FileShare, Int32 bufferSize, Opciones FileOptions, SECURITY_ATTRIBUTES secAttrs, Cadena MSGPATH, Boolean bFromProxy, Boolean useLongPath) 2481
System.IO.FileStream..ctor (String camino, el modo de FileMode, FileAccess acceso, FileShare acción, Int32 bufferSize, opciones FileOptions, MSGPATH cadena, booleano bFromProxy) 229 System.IO.FileStream..ctor (String camino, el modo de FileMode, FileAccess acceder, compartir FileShare) 102
System.Xml.XmlWriterSettings.CreateWriter (String OutputFileName) +5224496
System.Xml.Linq.XElement.Save (String nomArchivo, opciones SaveOptions) 108
mesoBoard.Services.SiteConfig.UpdateCache () 1971 mesoBoard.Web.MvcApplication.OnApplicationStarted () 62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start () 604[HttpException (0x80004005): El acceso a la el camino 'C: \ sitios de Internet \ misitioweb \ myfile.xml' es negado.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext contexto, HttpApplication app) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext contexto, MethodInfo [] manipuladores) 191
System.Web.HttpApplication.InitSpecial (HttpApplicationState estatales, MethodInfo [] manipuladores, IntPtr appContext, HttpContext contexto) 325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext contexto) 407 System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) 375[HttpException (0x80004005): El acceso a la el camino 'C: \ sitios de Internet \ misitioweb \ myfile.xml' es negado.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext contexto) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext contexto) 141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, HttpContext contexto) +4782309
Solución
Es necesario asegurarse de que la cuenta de usuario del grupo de aplicaciones que ejecuta el sitio web ha leído / permisos de escritura al archivo / carpeta. Por defecto, creo que usted debe tener permisos de lectura, pero no permisos de escritura. Además, por razones de seguridad, que podría ser una buena idea para mover ese archivo fuera de la carpeta wwwroot en algo que no se puede corromper toda su aplicación.
WebDir / datos
WebDir / datos / myfile.xmlWebDir / wwwroot
WebDir / wwwroot / default.aspx
Otros consejos
Sus sonidos de permisos IO como es sólo un problema de permisos con su archivo. Yo sé lo que cada vez que subo un archivo a mi proveedor de alojamiento, tengo que acceder a su panel de control y dar manualmente el acceso a la cuenta IIS escribir en él, como el acceso de lectura es el único permiso concedido de forma automática.
Por otro lado, la ubicación del archivo XML plantea un problema de seguridad. Trate de poner el archivo en la carpeta "~ / App_Data /", que es una carpeta especial .NET que está más restringida que la carpeta de datos - en el momento en que pude ir a www.yoursite.com/data/myfile.xml y descargarlo, mientras que cualquier archivo en la carpeta App_Data no se puede descargar a través de Internet.
¿Qué es la carpeta App_Data utilizado para en Visual Studio?
confianza medio especifica que la aplicación sólo tiene acceso a los $ AppDir. Puede personalizar el nivel de confianza medio para agregar un acceso adicional a la confianza medio alterando la FileIOPermission para incluir otros directorios de $ AppDir. Sin embargo, he encontrado que cuando se llama a Server.MapPath ( "/") bajo incluso una personalizada Medio Nivel de confianza, por lo que recibirá una solicitud de excepción "para el permiso de tipo 'System.Security.Permissions.FileIOPermission, mscorlib, versión = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' fallido "
Es mi teoría de que esto se debe a que está solicitando el acceso al sistema de archivos fuera de la de los $ AppDir". Terminamos tener que quitar todas las llamadas a Server.MapPath () desde nuestras aplicaciones web.
I creó un sitio web en GoDaddy y se encontró que la única manera de que pudiera permitir el acceso de escritura, era permitir que el toda raíz de la web , pero que podría haber sido sólo la restricción para ese plan de alojamiento ?