Доступ к файлам из сетевого ресурса в веб-приложении С#

У меня есть веб-приложение, которое должно читать (и, возможно, писать) файлы из общего сетевого ресурса. Мне было интересно, что лучший способ сделать это?

Я не могу предоставить сетевому сервису или учетным записям aspnet доступ к сетевому ресурсу. Я мог бы использовать олицетворение.

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


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

Есть одна проблема, с которой я могу думать с олицетворением... Я могу только олицетворять одного пользователя для каждого домена приложения, я думаю, но я счастлив, что его исправили. Возможно, мне придется записать этот файл в несколько разных разделов, что означает, что мне, возможно, придется выдавать себя за нескольких пользователей.

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

Ответ 1

Учитывая, что у всех уже есть учетные записи домена. Попробуйте интегрированную аутентификацию IIS. Вы получите уродливое окно входа в сеть, но ваши кредиты должны перейти к файловому ресурсу.

@lomaxx
Вы говорите, что только у вас есть perms на долю или что вы вручную сопоставили ее с буквой диска. Если позже вы можете использовать ucn\host\share так же, как и c:\shared_folder.

Случайные Было бы бременем отразить долю в локальной папке на хосте? Я слышал, что ROBOCOPY очень удобен.

Другая идея. Запустите IIS на своем целевом ресурсе, который вы можете прочитать через http, и если вам нужно написать исследование webdav.

Ответ 2

У меня не было проблем с прозрачным подключением к сетевым ресурсам, как если бы они были локальными дисками. Единственная проблема, с которой вы можете столкнуться, - это то, о чем вы упомянули: наличие учетной записи aspnet для доступа к доле. Возможно, олицетворение - лучший способ сделать это.

Вы должны иметь возможность использовать любые объекты потока для доступа к сетевому ресурсу, если на серверной машине есть буква диска.

Ответ 3

Олицетворение работало хорошо для меня в этом сценарии. У нас был мастер, который загружал zip файл через веб-сайт, но мы загружаем сбалансированный сайт. Поэтому необходимо настроить способ сохранения файла на всех машинах.

Есть много разных способов сделать это. Мы решили сделать все запросы для запуска под пользователем, который мы установили, и просто добавили запись в web.config и установили разрешения безопасности для папок для пользователя. Эта статья kb объясняет настройку очень хорошо.

Ответ 4

У вас есть некоторые варианты, и один из них - олицетворение, как вы упомянули. Однако другой, который я хотел бы использовать и использовал в прошлом, - это надежный вызов службы. Предположим на мгновение, что всегда намного безопаснее ограничивать доступ через 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 построить связь с сервисом, чтобы получить ваш токен, и вы отправитесь на гонки. Другая приятная вещь заключается в том, что эта служба является внутренней, надежной, и я даже размещал ее на файловом сервере раньше, и поэтому гораздо проще предоставить разрешения для этой операции.

Ответ 5

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