ASP.NET: Ошибка "Доступ к пути запрещен" при загрузке файлов на веб-сервер Windows Server 2008 R2
У меня есть веб-приложение на ASP.NET, которое загружает файлы в определенную папку на веб-сервере. На локальном сервере все работает отлично, но после развертывания приложения на веб-сервере я начинаю получать ошибку "Доступ к пути "D:\Attachments\myfile.doc" запрещен". Я предоставил пользователю "IIS AppPool", под которым работает приложение, полные права на эту папку. Я даже дал полные права группе "Все", но ошибка по-прежнему persists.
Я добавил папку в список исключений антивируса, но результат остался тем же. Я начинаю подозревать, что, возможно, на Windows Server 2008 R2 существует какая-то особенность, которая мешает моей загрузке работать. Буду признателен за вашу помощь.
Спасибо!
5 ответ(ов)
Щелкните правой кнопкой мыши на вашей папке на сервере или локальной машине и дайте полные права пользователю
IIS_IUSRS.
На этом всё!
Ваш аккаунт ASP.NET {MACHINE}\ASPNET
не имеет прав на запись в эту локализацию. Именно поэтому возникает ошибка.
Рекомендуется предоставить права доступа к ресурсу для идентификации запроса ASP.NET. Для этого выполните следующие шаги:
- Щелкните правой кнопкой мыши на папке, где происходит загрузка файлов, и выберите
Свойства
. - Перейдите на вкладку
Безопасность
и нажмитеИзменить
. - Нажмите
Добавить
, затем выберитеМестоположения
и укажите ваш локальный компьютер. - Нажмите
ОК
, затем в поле "Введите имя объекта для выбора" введитеASPNET
и нажмитеПроверить имена
. - Установите флажки для нужных прав доступа (например,
Полный доступ
).
Если это не сработает, выполните те же шаги, добавив Network Service
.
Теперь у вас должно отобразиться {MACHINENAME}\ASPNET
, и вы сможете установить разрешение на запись для этой учетной записи.
Если же приложение использует подмену идентификации через <identity impersonate="true"/>
, то идентификация будет анонимным пользователем (обычно IUSR_MACHINENAME
) или аутентифицированным пользователем запроса.
Либо вы можете использовать выделенную папку для хранения файлов в ASP.NET, которая называется App_Data
. Чтобы создать её, щелкните правой кнопкой мыши на вашем проекте ASP.NET (в Visual Studio) и выберите Добавить > Добавить папку ASP.NET > App_Data
. После этого вы сможете сохранять данные в этом месте:
var path = Server.MapPath("~/App_Data/file.txt");
System.IO.File.WriteAllText(path, "Hello World");
Проблема может заключаться в том, что у службы Network Service нет прав на чтение.
Решение:
Щелкните правой кнопкой мыши на вашей папке загрузки → Свойства → Безопасность → Изменить → Добавить → введите: NETWORK SERVICE → установите флажок "Полный доступ" → нажмите OK или Применить.
Если кто-то столкнётся с этой проблемой и найдёт этот ответ в поиске Google, имейте в виду, что необходимо указывать имя файла в методе SaveAs.
Вариант без имени файла не сработает:
file_upload.PostedFile.SaveAs(Server.MapPath(SaveLocation));
Вам нужно сделать так:
filename = Path.GetFileName(file_upload.PostedFile.FileName);
file_upload.PostedFile.SaveAs(Server.MapPath(SaveLocation + "\\" + filename));
Я предполагал, что метод SaveAs автоматически использует загруженное имя файла, но в итоге получал ошибку "Доступ запрещен". Ошибка не очень информативна и не объясняет суть проблемы.
Я сталкивался с этой проблемой однажды, и в моем случае решение заключалось в закрытии любого процесса в диспетчере задач, который использует или обращается к этому файлу.
В C# в чем разница между public, private, protected и отсутствием модификатора доступа?
Лучшая настройка непрерывной интеграции для одиночного разработчика (.NET) [закрыт]
Как запустить модульные тесты на платформе x64?
"Ошибка при выполнении криптографической операции при расшифровке cookie Forms"
Использование номера версии веб-приложения из сборки (ASP.NET/C#)