File.Exists () неправильно возвращает false из ASP.NET - проблема безопасности, связанная с идентификацией потока или процесса? - PullRequest
1 голос
/ 05 октября 2009

У меня есть приложение ASP.NET, использующее проверку подлинности Windows, и я проверяю наличие файла на удаленном сервере.

Я аутентифицируюсь как MYDOMAIN \ my.username - это работает.

Файл является \ MYSERVER \ WebShare \ example.txt. Этот файл существует. Я могу открыть его с разных хостов, войдя в систему как MYDOMAIN \ my.username. В проводнике Windows действующие разрешения указывают, что MYDOMAIN \ my.username имеет полный контроль над этим файлом.

Если я присоединяю отладчик и набираю $user в окне просмотра, я вижу, что текущий поток работает как MYDOMAIN \ my.username, в то время как текущий процесс все еще работает как NT AUTHORITY\NETWORK SERVICE - соответствующие биты окна просмотра воспроизводятся ниже:

$user  {...}  $user register
 +- Process  {...}  TOKEN
 |  +- Name                 NT AUTHORITY\NETWORK SERVICE  User Name
 |  +- User                 SID  S-1-5-20                 SID
 |  +- Session Id           0                             DWORD
 |  +- Loggin Id            000003e4-00000000             LUID
 |  +- Impersonation Level  N/A (not impersonating)       SECURITY_IMPERSONATION_LEVEL
 +- Thread  {...}  TOKEN
    +- Name                 MYDOMAIN\my.username          User Name
    +- User SID             S-1-5-21-...                  SID
    +- Session Id           0                             DWORD
    +- Loggin Id            018622ef-00000000             LUID
    +- Impersonation Level  Impersonate                   SECURITY_IMPERSONATION_LEVEL

Сервер, на котором работает ASP.NET, является членом группы MYDOMAIN \ Webservers, которая, в свою очередь, имеет полный контроль над общим файлом.

Вот что я не понимаю:

  1. Когда .NET пытается запросить File.Exists, используется ли thread или process удостоверение личности?
  2. Если он использует учетные данные процесса - как я могу заставить процесс запускаться от имени MYDOMAIN \ my.username или дать учетной записи NETWORK SERVICE разрешение на чтение файла? (Я думал, что это уже сделано, добавив мою учетную запись компьютера - но это не работает ...)
  3. Если он использует учетные данные потока - почему я не могу прочитать файл?

С благодарностью будут приняты любые указатели или полезные советы по отладке.

Спасибо

Dylan

1 Ответ

2 голосов
/ 05 октября 2009

В этих ситуациях я всегда запускаю Sysinternals Process Monitor и отфильтровываю рассматриваемый файл. Оттуда вы можете увидеть, какая учетная запись на самом деле имеет доступ к файлу.

Как правило, если вы не олицетворяете, будет использоваться учетная запись, на которой запущен пул приложений. Какая у вас учетная запись пула приложений?

По вопросу 2: Вы можете установить правильные разрешения для файла, щелкнув его правой кнопкой мыши в Проводнике и выбрав соответствующие разрешения. Оттуда вы можете добавить учетную запись сетевой службы и дать ей разрешения на чтение.

Какую ОС вы используете? В зависимости от ОС учетной записью пула приложений по умолчанию является либо сетевая служба, либо AppPoolIdentity, поэтому убедитесь, что вы проверяете правильную.

...