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

Редактировать 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 доступ к файлам (так как я не администратор домена).

Edit:
Путь - это 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.

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

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

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

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

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

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

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

0 голосов
/ 23 февраля 2010

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

...