Доступ к файлам из общего сетевого ресурса в веб-приложении C#
У меня есть веб-приложение, которое должно читать (и, возможно, записывать) файлы из общего сетевого ресурса. Мне было интересно, что лучший способ сделать это будет?
Я не могу предоставить сетевой службе или учетным записям aspnet доступ к сетевой папке. Я мог бы использовать подражание.
Общий сетевой ресурс и веб-приложение размещены в одном домене, и я могу создать нового пользователя в домене специально для этой цели, однако я не совсем уверен, как объединить точки между созданием файлового потока и указанием учетных данных для использования. в веб-приложении.
К сожалению, диск не отображается как сетевой диск на компьютере, он доступен только как сетевой ресурс, поэтому, к сожалению, я не могу сделать прозрачный вызов.
Есть одна проблема, которую я могу придумать с олицетворением... Я могу выдать себя за одного пользователя на домен приложения, я думаю, но я счастлив, что меня исправили. Мне может понадобиться записать этот файл в несколько разных общих ресурсов, что означает, что мне, возможно, придется выдавать себя за нескольких пользователей.
Мне нравится идея создания токена... если я смогу сделать это, я смогу предварительно запросить их учетные данные, а затем динамически применить защиту и дать им значимые сообщения об ошибках, если доступ запрещен... Я ухожу играть, но я вернусь с обновлением.
5 ответов
Учитывая, что у всех уже есть учетные записи домена. Попробуйте встроенную проверку подлинности IIS. Вы получите уродливое окно входа в сеть, но ваши кредиты должны перейти к общей папке.
@lomaxx
Вы говорите, что только у вас есть права доступа к общему ресурсу или вы вручную сопоставили его с буквой диска. Если позже вы можете использовать ucn \host\share точно так же, как вы использовали бы a c:\shared_folder.
Случайно Будет ли обременительно зеркалировать общий ресурс в локальную папку на хосте? Я слышал, что РОБОКОПИЯ очень удобна.
Другая идея. Запустите IIS на целевом ресурсе, который вы можете прочитать через http, и, если вам нужно написать, исследуйте webdav.
Если вы можете создать нового пользователя AD, я думаю, что самое простое решение - запустить пул приложений с правами этой учетной записи AD, что означает, что ваше приложение теперь работает как пользователь AD. Вам потребуется добавить пользователя AD в группу рабочих процессов IIS на компьютере, на котором выполняется ваше приложение. Тогда, пока ваш пользователь AD имеет права на запись в сетевой ресурс, вы сможете использовать путь UNC в ваших файловых операциях.
У вас есть несколько вариантов, и один из них - олицетворение, как вы упомянули. Тем не менее, еще один, который я люблю использовать и использовал в прошлом, это вызов доверенного сервиса. Давайте на минутку предположим, что всегда намного безопаснее ограничить доступ через IIS, чтобы обеспечить как можно меньше дыр. С этим давайте идти по этой дороге.
Создайте службу WCF, у которой есть пара точек входа, и интерфейс может выглядеть следующим образом.
public interface IDocumentService
{
public string BuildTrustedRelationship(string privateKey);
public byte[] ReadFile(string token, string fileName);
public void WriteFile(string token, string fileName, byte[] file);
}
Теперь вы можете очень легко разместить эту службу через службу Windows, и теперь все, что вам нужно сделать, это включить Application_start
Постройте отношения со службой, чтобы получить свой жетон, и вы отправитесь на гонки. Еще одна приятная вещь - это то, что этот сервис является внутренним, доверенным, и я даже ранее размещал его на файловом сервере, поэтому намного проще предоставлять разрешения для этой операции.
Олицетворение работало хорошо для меня в этом сценарии. У нас был мастер, который загрузил zip-файл через веб-сайт, но мы сбалансировали загрузку сайта. Поэтому необходимо настроить способ сохранения файла на всех машинах.
Есть много разных способов сделать это. Мы решили сделать все запросы для запуска под пользователем, которого мы настроили, и просто добавили запись web.config и настроили разрешения безопасности для папок для пользователя. Эта статья очень хорошо объясняет настройку.
У меня не было проблем с прозрачным подключением к сетевым ресурсам, как если бы это были локальные диски. Единственная проблема, которую вы можете иметь, это то, что вы упомянули: наличие aspnet
аккаунт получить доступ к общему ресурсу. Олицетворение, вероятно, лучший способ сделать это.
Вы должны иметь возможность использовать любые объекты файлового потока для доступа к общему сетевому ресурсу, если у него есть буква диска на сервере.