2010-06-27 2 views
5

Согласно этому MSDN article about medium trust, под средним доверием:Medium-Trust File I/O разрешение

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.

Однако для моего текущего хостинга-провайдера работает приложения под средним доверием, и когда я пытаюсь прочитать/записать файл в корневой папке приложения, я получаю ошибку access to path 'myfile.xml' denied.

Этот файл считывается с помощью следующей бит кода

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

Update Full Error:

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

Просьба показать полную трассировку стека и сообщение об исключении. Неясно, является ли это исключение безопасности CAS (CLR) или проблема с разрешением файла NTFS. – Eilon

+0

@Elion - обновлено с полной ошибкой. – Omar

+0

Какую версию IIS вы используете? Существуют ли какие-либо другие процессы, которые могут содержать блокировку файла myfile.xml? – jrista

ответ

1

Вы должны убедиться, что учетная запись пользователя из пула приложений работает веб-сайт имеет права на чтение/запись в файл/папку. По умолчанию, я думаю, у вас должны быть разрешения на чтение, но не разрешения на запись. Кроме того, по соображениям безопасности, может быть хорошей идеей переместить этот файл из папки wwwroot в то, что не может повредить ваше приложение.

webdir/data
webdir/data/myfile.xml

webdir/wwwroot
webdir/wwwroot/default.aspx

+0

Есть ли все-таки, чтобы читать/писать файлы, не имея при этом никаких прав доступа? Я имею в виду, что если мое приложение предназначено для создания новых файлов, которым нужен доступ для чтения/записи, а мои пользователи не являются техническими, есть ли способ обойти это? – Omar

+0

Я нашел информацию о настройке прав доступа к файлам здесь (http://www.experts-exchange.com/Web_Development/Miscellaneous/Q_23444174.html) или просто Google 'asp.net установить права доступа к файлам' –

0

Ваше разрешение ввода-вывода звучит так, как будто это проблема с вашим файлом. Я знаю, что всякий раз, когда я загружаю файл на хостинг-провайдера, я должен войти в свою панель управления и вручную предоставить ему доступ к записи IIS, поскольку доступ на чтение является единственным разрешением, предоставленным автоматически.

С другой стороны, расположение вашего xml-файла создает проблему безопасности. Попробуйте поместить файл в папку «~/App_Data /», это специальная папка .NET, которая более ограничена, чем ваша папка с данными - на данный момент я могу зайти на сайт www.yoursite.com/data/myfile.xml и загрузить ее, тогда как любой файл в папке App_Data не может быть загружен через Интернет.

What is the App_Data folder used for in Visual Studio?

0

Вы используете класс XElement. Пространство имен «System.Xml.Linq», вероятно, не разрешено в вашей конфигурации «среднего уровня» вашего хостинга. Для того, чтобы использовать Linq в доверительном среднего уровня, пожалуйста, следуйте следующим procedure

-1

Я создал сайт на GoDaddy и обнаружил, что единственный способ, которым я мог бы дать доступ на запись, должен был включить его для весь веб-корень но это может только что были ограничением для этого плана хостинга?

0

Medium Trust указывает, что приложение имеет доступ только к $ AppDir. Вы можете настроить средний уровень доверия для добавления дополнительного доступа к среднему доверию, изменив FileIOPermission, чтобы включить другие каталоги, чем $ AppDir. Тем не менее, я обнаружил, что при вызове Server.MapPath («/») даже под настроенным средним уровнем доверия вы получите исключение «Запрос на разрешение типа» System.Security.Permissions.FileIOPermission, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 «failed»

Это моя теория, потому что вы запрашиваете доступ к файловой системе за пределами $ AppDir ». В итоге нам пришлось удалить все вызовы к Server.MapPath() из наших веб-приложений.

Смежные вопросы