Возникла проблема, когда на некоторых серверах мы получаем ошибку о недопустимом имени каталога при использовании Path.GetTempFileName. Дальнейшее расследование показывает, что он пытается записать файл в c: \ Documents and Setting \ computername \ aspnet \ local settings \ temp (найденный с помощью Path.GetTempPath). Эта папка существует, поэтому я предполагаю, что это проблема с разрешениями в отношении учетной записи asp.net.
Некоторые мне сказали, что Path.GetTempFileName должен указывать на файлы C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ timeasp.net.
Мне также сказали, что эта проблема может быть связана с порядком, в котором IIS и .NET установлены на сервере. Я выполнил типичный «aspnet_regiis -i» и проверил безопасность папок и т. д. На этом этапе я застрял.
Может кто-нибудь пролить некоторый свет на это?
** Обновление: ** Оказывается, предоставление доступа «IUSR_ComputerName» к папке делает свое дело. Это правильная процедура? Кажется, я не припомню, чтобы делал это в прошлом, и, очевидно, хочу следовать лучшим практикам для поддержания безопасности. В конце концов, это часть процесса загрузки файла.





Вы можете использовать Path.GetTempPath (), чтобы узнать, в какой каталог он пытается записать.
Вероятно, это комбинация выдачи себя за другое лицо и несоответствие различных методов аутентификации.
Есть много штук; Я постараюсь пройтись по ним один за другим.
Выдача себя за другое лицо - это метод «временного» переключения учетной записи пользователя, под которой выполняется поток. По сути, поток на короткое время получает те же права и доступ - ни больше, ни меньше - что и учетная запись, которую олицетворяет. Как только поток завершает создание веб-страницы, он «возвращается» обратно к исходной учетной записи и готовится к следующему вызову. Этот метод используется для доступа к ресурсам, к которым имеет доступ только пользователь, выполнивший вход на ваш веб-сайт. Задержитесь на минуту за концепцию.
Теперь по умолчанию ASP.NET запускает веб-сайт под локальной учетной записью ASPNET. Опять же, по умолчанию только учетная запись ASPNET и члены группы администраторов могут писать в эту папку. Ваша временная папка находится под контролем этой учетной записи. Это вторая часть головоломки.
Выдача себя за другое лицо не происходит само по себе. Его нужно включить намеренно в вашем web.config.
<identity impersonate = "true" />
Если этот параметр отсутствует или имеет значение false, ваш код будет выполняться в чистом виде под учетной записью ASPNET, упомянутой выше. Учитывая ваше сообщение об ошибке, я уверен, что у вас imersonation = true. Там нет ничего плохого! Выдача себя за другое лицо имеет преимущества и недостатки, которые выходят за рамки этого обсуждения.
Остается один вопрос: когда вы используете олицетворение какой аккаунт выдает себя за другое лицо?
Если вы не укажете учетную запись в web.config (полный синтаксис элемента идентичности здесь), олицетворенная учетная запись - это та, которую IIS передал ASP.NET. И это зависит от того, как пользователь прошел аутентификацию (или нет) на сайте. Это ваша третья и последняя работа.
Учетная запись IUSR_ComputerName - это учетная запись с низким уровнем прав, созданная IIS. По умолчанию эта учетная запись является учетной записью, под которой выполняется веб-вызов если пользователь не может быть аутентифицирован. То есть пользователь входит как «анонимный».
Таким образом, с вами происходит следующее:
Ваш пользователь пытается получить доступ к веб-сайту, и IIS по какой-то причине не смог аутентифицировать этого человека. Поскольку анонимный доступ включен (или вы не увидите, что IUSRComputerName обращается к временной папке), IIS разрешает пользователю в любом случае, но как общий пользователь. Ваш код ASP.NET запускается и олицетворяет эту общую гостевую учетную запись IUSR___ComputerName; только теперь у кода нет доступа к тем вещам, к которым имела доступ учетная запись ASPNET, включая собственную временную папку.
Предоставление IUSR_ComputerName WRITE доступа к папке устраняет ваши симптомы.
Но это только симптомы. Вам нужно просмотреть почему человек приходит как «Аноним / Гость»?
Есть два вероятных сценария:
a) Вы намеревались использовать IIS для аутентификации, но настройки аутентификации в IIS для некоторых из ваших серверов неверны.
В этом случае вам необходимо отключить анонимный доступ на этих серверах, чтобы сработали обычные механизмы аутентификации. Обратите внимание, что вам все равно может потребоваться предоставить пользователям доступ к этой временной папке или использовать вместо нее другую папку, к которой ваши пользователи уже имеют доступ.
Я работал с этим сценарием много раз, и, честно говоря, избавление от папки Temp дает меньше головной боли; создайте выделенную папку на сервере, установите соответствующие разрешения и укажите ее местоположение в web.config.
б) Вы все равно не хотели аутентифицировать людей или хотели использовать аутентификацию с помощью форм ASP.NET (которая использует анонимный доступ IIS для обхода проверок в IIS и позволяет ASP.NET обрабатывать аутентификацию напрямую)
Этот случай немного сложнее.
Вам следует перейти в IIS и отключить все формы аутентификации, кроме «Анонимного доступа». Обратите внимание, что вы не можете сделать это в окне разработчика, потому что отладчику необходимо включить встроенную проверку подлинности. Таким образом, ваше окно отладки будет вести себя немного иначе, чем настоящий сервер; просто помните об этом.
Затем вам нужно решить, следует ли вам выключить олицетворение или, наоборот, указать учетную запись для олицетворения в файле web.config. Сделайте первое, если вашему веб-серверу не нужны внешние ресурсы (например, база данных). Сделайте последнее, если ваш веб-сайт действительно должен работать под учетной записью, имеющей доступ к базе данных (или другому внешнему ресурсу).
У вас есть еще две альтернативы, чтобы указать учетную запись для олицетворения. Во-первых, вы можете перейти в IIS и изменить «анонимную» учетную запись на учетную запись с доступом к ресурсу вместо той, которой IIS управляет за вас. Второй вариант - сохранить учетную запись и пароль в зашифрованном виде в реестре. Этот шаг немного сложен и также выходит за рамки данного обсуждения.
Удачи!
У меня была такая же проблема с одним из моих приложений ASP.Net. Я получал Path.GetTempPath (), но он выдавал исключение:
«Не удалось записать в файл« C: \ Windows \ Temp \ somefilename », исключение: доступ к пути« C: \ Windows \ Temp \ somefilename »запрещен».
Я попробовал несколько предложений на этой странице, но ничего не помогло.
В конце концов, я зашел на веб-сервер (сервер IIS) и изменил права доступа к каталогу сервера «C: \ Windows \ Temp», чтобы предоставить пользователю «Все» полные права на чтение и запись.
И вот, наконец, исключение исчезло, и мои пользователи могли скачивать файлы из приложения. Уф!
Я столкнулся с этой ошибкой при диагностике консольного приложения, которое записывало временные файлы. В одной из моих тестовых итераций я очистил все файлы / каталоги в temp для запуска «с чистого листа». Я решил эту проблему, вызванную самим собой, выйдя из системы и снова войдя в нее.