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