Path.GetTempFileName - неверное имя каталога

Возникла проблема, когда на некоторых серверах мы получаем ошибку о недопустимом имени каталога при использовании 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» к папке делает свое дело. Это правильная процедура? Кажется, я не припомню, чтобы делал это в прошлом, и, очевидно, хочу следовать лучшим практикам для поддержания безопасности. В конце концов, это часть процесса загрузки файла.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
12 266
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать Path.GetTempPath (), чтобы узнать, в какой каталог он пытается записать.

Возможно, IIS_WPG не имеет доступа к временной папке. Если вы считаете, что это проблема с правами доступа, запустите Procmon в рабочем процессе asp.net и проверьте наличие ошибок AccessDenied.

Ответ принят как подходящий

Вероятно, это комбинация выдачи себя за другое лицо и несоответствие различных методов аутентификации.

Есть много штук; Я постараюсь пройтись по ним один за другим.

Выдача себя за другое лицо - это метод «временного» переключения учетной записи пользователя, под которой выполняется поток. По сути, поток на короткое время получает те же права и доступ - ни больше, ни меньше - что и учетная запись, которую олицетворяет. Как только поток завершает создание веб-страницы, он «возвращается» обратно к исходной учетной записи и готовится к следующему вызову. Этот метод используется для доступа к ресурсам, к которым имеет доступ только пользователь, выполнивший вход на ваш веб-сайт. Задержитесь на минуту за концепцию.

Теперь по умолчанию 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 для запуска «с чистого листа». Я решил эту проблему, вызванную самим собой, выйдя из системы и снова войдя в нее.

Другие вопросы по теме