2010-06-27 14 views
5

Selon cette MSDN article about medium trust, sous moyenne confiance:Fichier Moyen-Trust permission d'E/S

FileIOPermission is restricted. This means you can only access files in your application's virtual directory hierarchy. Your application is granted Read, Write, Append, and PathDiscovery permissions for your application's virtual directory hierarchy.

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, j'obtiens une erreur access to path 'myfile.xml' denied.

Ce fichier est lu en utilisant le bit de code suivant

XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml")); 

Mise à jour d'erreur complète:

Access to the path 'C:\WebSites\mywebsite\myfile.xml' is denied.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.UnauthorizedAccessException: Access to the path 'C:\WebSites\mywebsite\myfile.xml' is denied.

ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. If the application is impersonating via , the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user.

To grant ASP.NET access to a file, right-click the file in Explorer, choose "Properties" and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the ASP.NET account, and check the boxes for the desired access.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[UnauthorizedAccessException: Access to the path 'C:\WebSites\mywebsite\myfile.xml' is denied.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12892935 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, Boolean useLongPath) +2481
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +102
System.Xml.XmlWriterSettings.CreateWriter(String outputFileName) +5224496
System.Xml.Linq.XElement.Save(String fileName, SaveOptions options) +108
mesoBoard.Services.SiteConfig.UpdateCache() +1971 mesoBoard.Web.MvcApplication.OnApplicationStarted() +62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start() +604

[HttpException (0x80004005): Access to the path 'C:\WebSites\mywebsite\myfile.xml' is denied.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): Access to the path 'C:\WebSites\mywebsite\myfile.xml' is denied.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4782309

+0

S'il vous plaît afficher la trace de la pile complète et le message de l'exception.Il ne est pas clair s'il s'agit d'une exception de sécurité CAS (CLR) ou un problème d'autorisation de fichier NTFS – Eilon

+0

@Elion - mis à jour avec l'erreur complète – Omar

+0

Quelle version d'IIS utilisez-vous? Y at-il d'autres processus qui peuvent contenir un verrou sur le fichier myfile.xml? – jrista

Répondre

1

Vous devez vous assurer que le compte utilisateur du pool d'applications en cours d'exécution du site possède des autorisations de lecture/écriture sur le fichier/dossier. Par défaut, je pense que vous devriez avoir lu les permissions mais pas les permissions en écriture. En outre, pour des raisons de sécurité, il peut être judicieux de déplacer ce fichier du dossier wwwroot vers un fichier qui ne peut pas corrompre l'intégralité de votre application.

webdir/data
webdir/data/myfile.xml

webdir/wwwroot
webdir/wwwroot/default.aspx

+0

Est-il possible de lire/écrire des fichiers sans avoir à vérifier que les permissions sont là? Je veux dire, si mon application est destinée à créer de nouveaux fichiers qui ont besoin d'un accès en lecture/écriture et que mes utilisateurs ne sont pas technophiles, y a-t-il un moyen de contourner cela? – Omar

+0

J'ai trouvé quelques informations sur la configuration des autorisations de fichiers ici (http://www.experts-exchange.com/Web_Development/Miscellaneous/Q_23444174.html) ou seulement Google 'asp.net set files permissions' –

0

Votre autorisation d'E/S semble être un problème d'autorisation avec votre fichier. Je sais que chaque fois que je télécharge un fichier sur mon hébergeur, je dois me connecter à leur panneau de contrôle et donner un accès en écriture au compte IIS, car l'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 placer le fichier dans le dossier "~/App_Data /", c'est un dossier spécial .NET qui est plus restreint que votre dossier de données - en ce moment je pourrais aller à www.yoursite.com/data/myfile.xml et le télécharger, tandis que tout fichier dans le dossier App_Data ne peut pas être téléchargé sur le Web.

What is the App_Data folder used for in Visual Studio?

0

Vous utilisez la classe XElement. L'espace de noms "System.Xml.Linq" n'est probablement pas autorisé dans votre configuration de "niveau intermédiaire" d'hébergement. Pour utiliser LINQ en fiducie de niveau moyen, s'il vous plaît suivre les éléments suivants procedure

-1

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 de permettre à la racine web tout mais cela pourrait vient d'être la restriction pour ce plan d'hébergement?

0

Moyenne Trust indique que l'application a uniquement accès au $ AppDir. Vous pouvez personnaliser le niveau de confiance moyen pour ajouter un accès supplémentaire à l'approbation moyenne en modifiant FileIOPermission pour inclure d'autres répertoires que $ AppDir. Cependant, j'ai trouvé que lorsque vous appelez Server.MapPath ("/") sous même un niveau de confiance moyen personnalisé, alors vous obtiendrez une exception "Demande de l'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089 'échoué'

C'est ma théorie que c'est parce que vous demandez l'accès au système de fichiers en dehors du $ AppDir. "Nous avons fini par devoir supprimer tous les appels à Server.MapPath() de nos applications Web