Разрешение ввода-вывода для файлов среднего уровня доверия
Согласно этой статье MSDN о среднем доверии, при среднем доверии:
FileIOPermission ограничен. Это означает, что вы можете получить доступ только к файлам в иерархии виртуальных каталогов вашего приложения. Вашему приложению предоставляются разрешения на чтение, запись, добавление и PathDiscovery для иерархии виртуальных каталогов вашего приложения.
Тем не менее, мой текущий хостинг-провайдер запускает приложения со средним уровнем доверия, и когда я пытаюсь прочитать / записать файл в корневой папке приложения, я получаю access to path 'myfile.xml' denied
ошибка.
Этот файл читается с использованием следующего кода
XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));
Обновить полную ошибку:
Доступ к пути "C:\WebSites\mywebsite\myfile.xml" запрещен.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.UnauthorizedAccessException: доступ к пути "C:\WebSites\mywebsite\myfile.xml" запрещен.
ASP.NET не авторизован для доступа к запрашиваемому ресурсу. Рассмотрите возможность предоставления прав доступа к ресурсу для удостоверения запроса ASP.NET. ASP.NET имеет базовый идентификатор процесса (обычно {MACHINE} \ ASPNET в IIS 5 или Network Service в IIS 6 и IIS 7 и настроенный идентификатор пула приложений в IIS 7.5), который используется, если приложение не олицетворяет собой. Если приложение олицетворяет себя с помощью идентификатора, это будет анонимный пользователь (обычно IUSR_MACHINENAME) или аутентифицированный пользователь запроса.
Чтобы предоставить ASP.NET доступ к файлу, щелкните правой кнопкой мыши файл в проводнике, выберите "Свойства" и перейдите на вкладку "Безопасность". Нажмите "Добавить", чтобы добавить соответствующего пользователя или группу. Выделите учетную запись ASP.NET и установите флажки для желаемого доступа.
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.
Трассировки стека:
[UnauthorizedAccessException: доступ к пути 'C:\WebSites\mywebsite\myfile.xml' запрещен.]
System.IO.__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) +12892935 System.IO.FileStream.Init(Строковый путь, режим FileMode, доступ к FileAccess, права Int32, логические значения useRights, общий доступ к FileShare, размер буфера Int32, параметры FileOptions, параметры SECURITY_ATttIBUT SATURITY_ATTRIBUTES, Строка msgPath, логическое значение bFromProxy, логическое значение useLongPath) +2481
System.IO.FileStream..ctor (Строковый путь, режим FileMode, доступ к FileAccess, общий доступ к FileShare, Int32 bufferSize, параметры FileOptions, строка String msgPath, Boolean bFromProxy) +229 System.IO.FileStream..ctor(путь строки, режим FileMode, Доступ к FileAccess, общий доступ к FileShare) +102
System.Xml.XmlWriterSettings.CreateWriter (String outputFileName) +5224496
System.Xml.Linq.XElement.Save (строковое имя файла, параметры SaveOptions) +108
mesoBoard.Services.SiteConfig.UpdateCache () +1971 mesoBoard.Web.MvcApplication.OnApplicationStarted () +62 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start () +604[HttpException (0x80004005): доступ к пути "C:\WebSites\mywebsite\myfile.xml" запрещен.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (контекст HttpContext, приложение HttpApplication) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionWithIIS(IntPtr appContext, контекст метода HttpInfo1), контекст HttpConfoxt]
System.Web.HttpApplication.InitSpecial (состояние HttpApplicationState, обработчики MethodInfo[], IntPtr appContext, контекст HttpContext) +325 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpInline.Text.Intext.TunTimeTimeTech). IntPtr appContext) +375[HttpException (0x80004005): доступ к пути "C:\WebSites\mywebsite\myfile.xml" запрещен.]
System.Web.HttpRuntime.FirstRequestInit (контекст HttpContext) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit (контекст HttpContext) +141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, контекст HttpContext) +4782309
5 ответов
Необходимо убедиться, что учетная запись пользователя пула приложений, на котором запущен веб-сайт, имеет разрешения на чтение / запись для файла / папки. По умолчанию, я думаю, у вас должны быть права на чтение, но не права на запись. Кроме того, по соображениям безопасности было бы неплохо переместить этот файл из папки wwwroot во что-то, что не может повредить все ваше приложение.
webdir / данные
webdir / data /myfile.xmlwebdir / Wwwroot
webdir / Wwwroot/default.aspx
Вы используете класс XElement. Пространство имен "System.Xml.Linq", вероятно, не разрешено в конфигурации вашего хостинга "среднего уровня". Чтобы использовать Linq со средним уровнем доверия, выполните следующую процедуру
Среднее доверие указывает, что приложение имеет доступ только к $AppDir. Вы можете настроить средний уровень доверия, чтобы добавить дополнительный доступ к среднему доверию, изменив FileIOPermission для включения других каталогов, кроме $AppDir. Тем не менее, я обнаружил, что при вызове Server.MapPath("/") даже с настроенным средним уровнем доверия, вы получите исключение "Запрос на разрешение типа 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Культура = нейтральная, PublicKeyToken=b77a5c561934e089'ошибка'
Я полагаю, что это потому, что вы запрашиваете доступ к файловой системе вне $AppDir". В итоге нам пришлось удалить все вызовы Server.MapPath() из наших веб-приложений.
Ваше разрешение ввода-вывода звучит так, как будто это просто проблема с разрешением вашего файла. Я знаю, что всякий раз, когда я загружаю файл своему провайдеру хостинга, мне приходится входить в его панель управления и вручную предоставлять доступ для записи учетной записи IIS, поскольку доступ на чтение является единственным разрешением, предоставляемым автоматически.
С другой стороны, местоположение вашего XML-файла создает проблему безопасности. Попробуйте поместить файл в папку "~/App_Data/", это специальная папка.NET, которая более ограничена, чем ваша папка с данными - на данный момент я могу перейти на www.yoursite.com/data/myfile.xml и загрузить его, тогда как любой файл в папке App_Data не может быть загружен через Интернет.
Я настроил веб-сайт на GoDaddy и обнаружил, что единственный способ, которым я мог разрешить доступ на запись, - это включить его для всего веб-корня, но это могло быть только ограничением для этого плана хостинга?