Использование WindowsIdentity для получения списка файлов/каталогов в ASP.NET при входе в систему с использованием проверки подлинности с помощью форм

Редактировать 7:
Я предполагаю, что это невозможно сделать в конце концов, возможно, потребуется использовать какое-то приложение командной строки, чтобы сделать это и проанализировать вывод, хотя я ожидаю, что это может быть очень медленным, когда к папке обращается много людей и/или достигнут предел сеанса NetBIOS.

Редактировать 6:
Используя встроенную проверку подлинности Windows (с учетной записью, имеющей доступ к общему ресурсу и базе данных), я могу получить список файлов/каталогов. Однако обновите страницу и получите UnauthorizedAccessException. Возможно, ограничение NetBIOS или ActiveDirectory.

5 месяцев и до сих пор нет решения, кроме «использовать олицетворение» (кажется, через P/Invoke, поскольку встроенный способ .NET кажется таким ненадежным), но это также будет иметь ту же проблему. Жесткое кодирование имени пользователя/пароля не вариант.

Блок разработки (Windows 7) (с использованием встроенного веб-сервера IIS или Visual Studio) работает нормально.

Изменить 5:
Из того, что я прочитал в Интернете и в этом вопросе, единственными способами для этого являются:

  • Базовая аутентификация
  • Олицетворение
  • Иметь файлы на том же сервере, что и веб-приложение

Ни один из этих вариантов не является

  • Пользователям приходится каждый раз входить в систему - недостаток: дополнительный барьер для входа, должно быть беспрепятственно
  • Имя пользователя и пароль жестко запрограммированы - недостаток: пароли меняются, закодированный пользователь (учетная запись asp.net) не будет иметь доступа к файлам
  • Слишком много файлов для хранения на веб-сервере, недостаточно места на диске

Поскольку должны быть приложения Windows Forms, которые могут получить доступ к общим файлам UNC, я думал, что это сработает. Это, а также тот факт, что при удаленном подключении к веб-серверу и с помощью проводника Windows я могу получить доступ к файлам.

Возможно, безопасность ASP.NET/IIS не позволяет ему работать без олицетворения через P/Invoke. Или, может быть, блокируется брандмауэром?

Правка 4.
Одна вещь, которая работает, — это использование обычной аутентификации, а встроенная аутентификация Windows и дайджест-аутентификация — нет. Однако на самом деле это не вариант, поскольку пароль отправляется в виде открытого текста, и пользователь получит подсказку при посещении страницы (не то, что я хочу делать).

Редактировать 3:
Что бы я ни пытался, я не могу получить список файлов или каталогов по пути UNC (как в комбинации, так и по отдельности)

  1. Предоставление «Всем» полного доступа к папке (а не только чтение)
  2. Учитывая учетную запись ASP.NET «Действовать как часть операционной системы»
  3. Данная группа IIS_WPG «Действовать как часть операционной системы»
  4. Б/у <authentication mode="Windows" />
  5. Б/у <identity impersonate="true"/>

Если я удаленно подключаюсь (используя RDP) к серверу с той же учетной записью, которую я использую для входа на сайт, я могу нормально получить доступ к файлам. Это просто не работает через код.

Редактировать 2:
Что я пробовал:

  1. Включите проверку подлинности Windows: доступ к файлам возможен только на том же компьютере (не общий ресурс UNC), невозможно подключиться к базе данных.
  2. Включить проверку подлинности с помощью форм, можно подключаться к базе данных, но не получать доступ к файлам (из-за InvalidCastException, так как идентификатор теперь равен GenericIdentity)

Я не могу использовать проверку подлинности Windows, так как не могу добавлять роли. Я не хочу запрашивать имя пользователя/пароль, так как это дополнительный шаг, и он не связан с безопасным соединением (например, SSL). Также я не могу предоставить учетной записи ASP.NET доступ к файлам (поскольку я не администратор домена).

Изменить:
Путь представляет собой путь в формате UNC, а не на локальном ПК.

Используя проверку подлинности с помощью форм, когда я пытаюсь преобразовать текущий идентификатор пользователя в WindowsIdentity в Visual Studio, и при отладке я получаю InvalidCastException. У меня просто есть:

WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity;

Тогда ошибка, которую я получаю:

Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Security.Principal.WindowsIdentity'

Я использую олицетворение для получения списка файлов, поскольку учетная запись ASP.NET не имеет доступа к этим файлам. Это работает при использовании IIS, но не в Visual Studio:

WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
 files = Directory.GetFiles("\\server\share");
 context.Undo();
}

Добавление <identity impersonate="true" /> к web.config ничего не делает, хотя я не хочу этого делать, поскольку я использую учетную запись ASP.NET для запроса базы данных, к которой у пользователя нет прав доступа (в результате Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON').

Когда я включаю аутентификацию Windows через web.config, я получаю UnauthorizedAccessException при попытке получить список файлов из удаленного общего ресурса (к которому в противном случае я мог бы получить доступ, если бы я удаленно подключился к ящику IIS как тот же пользователь на клиентском ПК) .

Кроме того, учетная запись ASP.NET — это учетная запись, созданная в Active Directory, а не локальная для IIS.


person SamWM    schedule 23.02.2010    source источник


Ответы (2)


Как говорит РичардОД, у вас возникнут проблемы с запуском кода, указанного как в IIS, так и в WebDev.

Лучший вариант — «Проект» > «Свойства» > «Веб» > «Использовать локальный веб-сервер IIS».

В противном случае вам необходимо изменить стратегию управления доступом.

Редактировать в ответ на комментарии: мне кажется, что OP нужно сделать какое-то жесткое олицетворение:

Я использовал этот код в прошлом, чтобы подключиться к UNC как другой пользователь из кода программной части. Существует также более текущая версия это выглядит хорошо, но я не использовал его, поэтому не могу поручиться.

Это может помочь, может нет. Стоит попробовать.

person Sky Sanders    schedule 23.02.2010
comment
Это работает, хотя аутентификация с помощью форм используется для входа на сайт в целях администрирования. Однако мы пытаемся создать систему в гибридном стиле, поскольку на многих сайтах уже используется проверка подлинности с помощью форм и система ролей, чтобы определить, к чему пользователь может получить доступ и что делать. - person SamWM; 23.02.2010
comment
@ Сэм, тогда почему ты пытаешься плыть против течения, чувак? ;-) Предоставьте себе права NTFS на машине разработчика, так как это личность, на которой работает cassini. Смешивание режимов — очень плохая идея, и это приведет к вонючему коду. - person Sky Sanders; 23.02.2010
comment
Я хочу использовать настраиваемые роли, не входящие в Active Directory, так как у меня нет прав на создание групп безопасности. При включении проверки подлинности Windows я не могу использовать роли проверки подлинности форм, такие как «администратор» или «документы» и т. д. - person SamWM; 23.02.2010
comment
@sam, мой ответ в настоящее время отражает ваш вопрос. Если мы решим вашу проблему здесь, в комментариях, я обновлю свой ответ. Итак, чтобы повторить, используйте аутентификацию форм, определите свои роли и дайте себе разрешения на доступ к файлам (как если бы ВЫ были процессом IIS, которым вы являетесь при использовании cassini) - person Sky Sanders; 23.02.2010
comment
@sam, по мере того, как вы предоставляете более подробную информацию, вопрос становится более интересным. У вас могут возникнуть небольшие проблемы с запуском этого кода как в IIS, так и в WebDev. У RichardOD было хорошее решение. ваше единственное решение на самом деле, учитывая ситуацию. И это при условии, что ваш ящик находится в домене. - person Sky Sanders; 23.02.2010
comment
@ Сэм, судя по вашим комментариям, вы хотите использовать аутентификацию Windows в сочетании с форумами SqlRoleProvider- . asp.net/t/932456.aspx? Вы знали, что это возможно? - person RichardOD; 25.02.2010
comment
По-прежнему не удается получить доступ к файлам через общий ресурс UNC, несмотря на то, что он следовал инструкциям из различных статей о том, как получить доступ к данным в общих ресурсах. - person SamWM; 05.03.2010
comment
@Sam, похоже, тебе нужно хардкорно подражать. Позвольте мне найти код, который, как я знаю, работает в описанной вами ситуации. - person Sky Sanders; 05.03.2010

Вы имеете в виду использование встроенного веб-сервера (Cassini)? Олицетворение работает не так, как в IIS (см. Cassini считается вредным). Вы можете использовать IIS в качестве веб-сервера в Visual Studio. Я обычно так и делаю, так как это предотвращает такие странные проблемы со временем развертывания, как эта.

person RichardOD    schedule 23.02.2010