il permesso di medio-Trust File I / O
-
30-09-2019 - |
Domanda
In base a questo MSDN articolo sulla attendibilità media , sotto medio-trust:
FileIOPermission è limitato. Questo significa che è possibile solo accedere ai file in directory virtuale dell'applicazione gerarchia. L'applicazione è concesso Leggere, scrivere, aggiungere, e PathDiscovery autorizzazioni per i tuoi dell'applicazione gerarchia di directory virtuale.
Tuttavia, per il mio fornitore di hosting corrente esegue applicazioni sotto medio fiducia e quando provo a leggere / scrivere un file nella cartella principale dell'applicazione, ottengo un errore di access to path 'myfile.xml' denied
.
Questo file viene letto utilizzando il seguente pezzo di codice
XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));
Errore aggiornamento completo:
Accesso al percorso 'C: \ WebSites \ MyWebSite \ myfile.xml' IS negato.
Descrizione: un'eccezione non gestita durante l'esecuzione del richiesta Web corrente. Si prega di rivedere la Analisi dello stack per ulteriori informazioni su l'errore e dove ha avuto origine in il codice.
Dettagli eccezione: System.UnauthorizedAccessException: Accesso al percorso 'C: \ WebSites \ MyWebSite \ myfile.xml' IS negato.
ASP.NET non è autorizzato ad accedere la risorsa richiesta. Ritenere la concessione dei diritti di accesso alla risorsa alla richiesta di identità di ASP.NET. ASP.NET ha un'identità processo di base (In genere {} MACHINE \ ASPNET su IIS 5 o Servizio di rete su IIS 6 e IIS 7, e il pool di applicazioni configurato identità su IIS 7.5) che viene utilizzato se l'applicazione non sta impersonando. Se l'applicazione è impersonando attraverso , l'identità sarà l'anonimo utente (tipicamente IUSR_MACHINENAME) o l'utente richiesta autenticata.
Per concedere l'accesso ASP.NET a un file, fare clic destro sul file in Esplora risorse, scegliere "Proprietà" e selezionare la scheda Protezione. Fai clic su "Aggiungi" per aggiungere il utente o gruppo appropriato. Evidenziare l'account ASP.NET, e controllare il scatole per l'accesso desiderato.
Errore Origine:
un'eccezione non gestita è stata generata durante l'esecuzione della corrente richiesta web. Le informazioni relative al origine e la posizione dell'eccezione può essere identificato tramite l'eccezione Analisi dello stack di seguito.
Analisi dello stack:
[UnauthorizedAccessException: Accesso al percorso 'C: \ WebSites \ MyWebSite \ myfile.xml' IS negato.]
System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) +12892935 System.IO.FileStream.Init (percorso String, modalità FileMode, accesso FileAccess, diritti Int32, useRights booleani, FileShare quota, Int32 bufferSize, opzioni FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, booleano bFromProxy, booleano useLongPath) 2481
System.IO.FileStream..ctor (String percorso, modalità FileMode, FileAccess accesso, FileShare azione, Int32 bufferSize, opzioni FileOptions, String msgPath, booleano bFromProxy) 229 System.IO.FileStream..ctor (String percorso, modalità FileMode, FileAccess accedere, condividere FileShare) 102
System.Xml.XmlWriterSettings.CreateWriter (String OutputFileName) +5224496
System.Xml.Linq.XElement.Save (String fileName, SaveOptions opzioni) 108
mesoBoard.Services.SiteConfig.UpdateCache () 1971 mesoBoard.Web.MvcApplication.OnApplicationStarted () +62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start () 604[HttpException (0x80004005): Accesso alla il sentiero 'C: \ WebSites \ MyWebSite \ myfile.xml' IS negato.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext contesto, HttpApplication app) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext contesto, MethodInfo [] movimentatori) 191
System.Web.HttpApplication.InitSpecial (HttpApplicationState statali, MethodInfo [] movimentatori, IntPtr appContext, HttpContext contesto) 325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext contesto) 407 System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) 375[HttpException (0x80004005): Accesso alla il sentiero 'C: \ WebSites \ MyWebSite \ myfile.xml' IS negato.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext contesto) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext contesto) 141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, HttpContext contesto) +4782309
Soluzione
È necessario assicurarsi che l'account utente del pool di applicazioni in esecuzione il sito ha letto / permessi di scrittura il file / cartella. Per impostazione predefinita, penso che si dovrebbe avere autorizzazioni di lettura, ma autorizzazioni non di scrittura. Inoltre, per motivi di sicurezza, potrebbe essere una buona idea per spostare il file dalla cartella wwwroot in qualcosa che non può corrompere l'intera applicazione.
WEBDIR / dati
WEBDIR / dati / myfile.xmlWEBDIR / wwwroot
WEBDIR / wwwroot / default.aspx
Altri suggerimenti
I tuoi IO suoni autorizzazione come se fosse solo un problema di autorizzazione con il file. So quello che ogni volta che caricare un file al mio fornitore di hosting, devo accedere al proprio pannello di controllo e dare manualmente l'IIS accesso all'account scrittura ad esso, come l'accesso in lettura è l'unica autorizzazione concessa automaticamente.
In un'altra nota, la posizione del file XML pone un problema di sicurezza. Prova a mettere il file nella cartella "~ / App_Data /", si tratta di una speciale cartella .NET che è più limitato di quanto la cartella di dati - in questo momento potevo andare a www.yoursite.com/data/myfile.xml e scaricarlo, considerando che qualsiasi file nella cartella App_Data non può essere scaricato attraverso il web.
Qual è la cartella App_Data utilizzata per in Visual Studio?
Si utilizza la classe XElement. Lo spazio dei nomi "System.Xml.Linq" probabilmente non è consentito nella configurazione di hosting "medio livello". Per utilizzare Linq nel livello medio di fiducia, si prega di seguire il seguente procedura
Medium Trust specifica che l'applicazione ha accesso solo al $ AppDir. È possibile personalizzare il livello medio fiducia per aggiungere un ulteriore accesso al mezzo fiducia alterando la FileIOPermission per includere altre directory di $ AppDir. Tuttavia, ho scoperto che quando si chiama Server.MapPath ( "/") sotto anche un Medium Trust Livello personalizzato, quindi si otterrà una richiesta di eccezione "per l'autorizzazione di tipo 'System.Security.Permissions.FileIOPermission, mscorlib, versione = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' non riuscita "
E 'la mia teoria che questo è perché si richiede l'accesso al file system di fuori del del $ AppDir". Abbiamo finito per dover rimuovere tutte le chiamate a Server.MapPath () dai nostri applicazioni web.
ho creato un sito web su GoDaddy e ha scoperto che l'unico modo ho potuto consentire l'accesso in scrittura, è stato quello di consentire per la radice intera web , ma che potrebbe avere appena stata la restrizione per questo piano di hosting ?