Moyen-Trust Fichier permission I / O
-
30-09-2019 - |
Question
Selon cette article MSDN sur la confiance moyenne , sous moyenne confiance:
FileIOPermission est limité. Cette signifie que vous pouvez uniquement accéder aux fichiers en répertoire virtuel de votre application hiérarchie. Votre demande est acceptée Lire, écrire, Append et PathDiscovery autorisations pour votre application de hiérarchie de répertoire virtuel.
Cependant, pour mon fournisseur d'hébergement actuel exécute des applications sous moyenne confiance et quand j'essaie de lire / écrire un fichier dans le dossier racine de l'application, je reçois une erreur de access to path 'myfile.xml' denied
.
Ce fichier est lu en utilisant le bit suivant du code
XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));
mise à jour complète Erreur:
L'accès au chemin 'C: \ WebSites \ mywebsite \ myfile.xml' est nié.
Description: Une exception non gérée produite pendant l'exécution de la demande web actuelle. S'il vous plaît examiner la Trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails de l'exception: System.UnauthorizedAccessException: L'accès au chemin 'C: \ WebSites \ mywebsite \ myfile.xml' est nié.
ASP.NET est pas autorisé à accéder la ressource demandée. Considérer accorder des droits d'accès à la ressource à l'identité de la demande ASP.NET. ASP.NET a une identité de processus de base (Généralement {MACHINE} \ ASPNET sur IIS 5 ou service réseau sur IIS 6 et IIS 7, et le pool d'applications configurées identité sur IIS 7.5) qui est utilisé si l'application ne personnifiait. Si l'application est personnifiait via , l'identité sera l'anonyme l'utilisateur (typiquement IUSR_MACHINENAME) ou l'utilisateur demande authentifiée.
Pour autoriser l'accès à un fichier ASP.NET, clic droit sur le fichier dans l'Explorateur, choisissez « Propriétés » et sélectionnez la onglet Sécurité. Cliquez sur « Ajouter » pour ajouter le utilisateur ou groupe approprié. Surligner le compte ASP.NET, et vérifiez la Les boîtes pour l'accès souhaité.
Erreur source:
Une exception non gérée a été générée lors de l'exécution du courant demande Web. Les informations concernant la origine et l'emplacement de l'exception peuvent être identifiés à l'aide l'exception Trace de la pile ci-dessous.
Trace de la pile:
[UnauthorizedAccessException: Accès au trajet 'C: \ WebSites \ mywebsite \ myfile.xml' est nié.]
System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) +12892935 System.IO.FileStream.Init (chemin String, le mode FileMode, accès FileAccess, droits Int32, useRights booléennes, part FileShare, Int32 bufferSize, Options FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) 2481
System.IO.FileStream..ctor (String chemin, le mode FileMode, FileAccess accès, part FileShare, Int32 bufferSize, options FileOptions, Chaîne msgPath, Boolean bFromProxy) +229 System.IO.FileStream..ctor (String chemin, le mode FileMode, FileAccess accès, part FileShare)
+102 System.Xml.XmlWriterSettings.CreateWriter (String outputFileName) +5224496
System.Xml.Linq.XElement.Save (String fileName, options SaveOptions) +108
mesoBoard.Services.SiteConfig.UpdateCache () 1.971 mesoBoard.Web.MvcApplication.OnApplicationStarted () 62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start () +604[HttpException (0x80004005): L'accès à le chemin 'C: \ WebSites \ mywebsite \ myfile.xml' est nié.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext contexte, HttpApplication app) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, contexte HttpContext, MethodInfo [] gestionnaires)
+191 System.Web.HttpApplication.InitSpecial (HttpApplicationState Etat, MethodInfo [] Chariot, IntPtr appContext, HttpContext contexte) +325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext contexte) +407 System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) 375[HttpException (0x80004005): L'accès à le chemin 'C: \ WebSites \ mywebsite \ myfile.xml' est nié.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext contexte) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext contexte)
+141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, HttpContext contexte) +4782309
La solution
Vous devez vous assurer que le compte utilisateur du pool d'applications en cours d'exécution du site a autorisations de lecture / écriture dans le fichier / dossier. Par défaut, je pense que vous devriez avoir des autorisations de lecture, mais les autorisations pas écrire. En outre, pour des raisons de sécurité, il pourrait être une bonne idée de déplacer ce fichier sur le dossier wwwroot dans quelque chose que l'ensemble de votre application ne peut pas corrompre.
webdir / données
webdir / data / myfile.xmlwebdir / wwwroot
webdir / wwwroot / default.aspx
Autres conseils
Vos sons d'autorisation IO comme il est juste un problème d'autorisation avec votre dossier. Je sais ce que chaque fois que je télécharge un fichier à mon fournisseur d'hébergement, je dois connecter à leur panneau de commande et donner manuellement l'accès en écriture de compte IIS, comme un accès en lecture est la seule autorisation accordée automatiquement.
Sur une autre note, l'emplacement de votre fichier xml pose un problème de sécurité. Essayez de mettre le fichier dans le « ~ / App_Data / dossier », il est un dossier spécial .NET qui est plus restreint que votre dossier de données - au moment où je pourrais aller à www.yoursite.com/data/myfile.xml et le télécharger, alors que tout fichier dans le dossier App_Data ne peut pas être téléchargé sur le Web.
Qu'est-ce que le dossier App_Data utilisé pour dans Visual studio?
Vous utilisez la classe XElement. L'espace de noms « System.Xml.Linq » est probablement pas autorisé dans votre hébergement configuration « niveau moyen ». Pour utiliser LINQ en fiducie de niveau moyen, s'il vous plaît suivre la procédure suivant
Medium confiance spécifie que l'application n'a accès à la AppDir $. Vous pouvez personnaliser le niveau de confiance moyen d'ajouter un accès supplémentaire à la fiducie moyen en modifiant la FileIOPermission pour inclure d'autres répertoires que $ AppDir. Cependant, je trouve que lorsque vous appelez Server.MapPath ( « / »), même sous une fiducie moyenne sur mesure de niveau, vous obtiendrez une exception « Demande d'autorisation de type « System.Security.Permissions.FileIOPermission, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' a échoué "
Il est ma théorie que ce soit parce que vous demandez l'accès au système de fichiers en dehors du du AppDir $ ». Nous avons fini par avoir à retirer tous les appels à Server.MapPath () de nos applications Web.
Je mis en place un site Web sur GoDaddy et a constaté que la seule façon que je pouvais permettre l'accès en écriture, était pour lui permettre de toute racine web , mais qui aurait pu juste été la restriction de ce plan d'hébergement ?