Редактировать 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 (как в комбинации, так и по отдельности)
- Предоставление «Всем» полного доступа к папке (а не только чтение)
- Учитывая учетную запись ASP.NET «Действовать как часть операционной системы»
- Данная группа IIS_WPG «Действовать как часть операционной системы»
- Б/у
<authentication mode="Windows" />
- Б/у
<identity impersonate="true"/>
Если я удаленно подключаюсь (используя RDP) к серверу с той же учетной записью, которую я использую для входа на сайт, я могу нормально получить доступ к файлам. Это просто не работает через код.
Редактировать 2:
Что я пробовал:
- Включите проверку подлинности Windows: доступ к файлам возможен только на том же компьютере (не общий ресурс UNC), невозможно подключиться к базе данных.
- Включить проверку подлинности с помощью форм, можно подключаться к базе данных, но не получать доступ к файлам (из-за
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.