ASP.NET Чтение файлов из защищенного паролем сетевого ресурса
-
19-09-2019 - |
Вопрос
У меня есть веб-сайт ASP.NET на сервере Windows 2003, которому необходим доступ к файлам из общего сетевого ресурса.Общий сетевой ресурс защищен паролем, и для его использования необходимо указать имя пользователя и пароль.
Я использую аутентификацию на основе форм на веб-сайте, а не на базе Windows.
Итак, моя проблема в том, что когда я пытаюсь прочитать любой файл из networkshare, используя приведенный ниже код, он выдает отказ в доступе DirectoryInfo networkShare = новый DirectoryInfo("\\Тестовый сервер\Общий ресурс");
Итак, я попытался использовать Impersonate, предоставив имя пользователя и пароль сетевого ресурса для вызова функции impersonate, однако вызов, очевидно, завершается неудачей, поскольку это имя пользователя не существует на веб-сервере ASP.NET.Итак, затем я передал имя пользователя и пароль для входа, который существует на веб-сервере, так что на этот раз вызов impersonate работает, однако он по-прежнему не может получить доступ к сетевому ресурсу, потому что имя пользователя и пароль сетевого ресурса разные.
Итак, наконец, я создал точно такое же имя пользователя / пароль на веб-сервере, который соответствует общему сетевому ресурсу.На этот раз вызов функции impersonate работает, как и общий доступ к сети.Я могу успешно читать из общего ресурса.
Итак, мой вопрос в том, есть ли способ, которым я могу прочитать общий сетевой ресурс, не добавляя имя пользователя на веб-сервере.Потому что каждый раз, когда меняется логин сетевого ресурса, мне придется снова создавать новое имя пользователя и на веб-сервере.Что далеко не идеально.
Есть какие-нибудь идеи?
Решение
"Правильный" способ сделать это - запустить AppPool веб-сервера в качестве идентификатора, который может получить доступ к общему ресурсу.Таким образом, единственное хранилище учетных данных надежно хранится в конфигурации IIS (а не в вашем коде или в удобочитаемых файлах конфигурации).Размещение веб-сервера и файлового сервера в одном домене Windows (или в разных доменах с доверием) - самый простой способ, но там также должно работать "одно и то же имя пользователя / пароль".
Если вам не нужно указывать имена пользователей / пароли в своем коде или конфигурации, вы можете вызвать WNetAddConnection2 и передать имя пользователя / пароль - тогда вы сможете получить доступ к общему ресурсу.Для этого не требуется, чтобы веб-сервер имел соответствующую учетную запись, но вам действительно следует защитить пароль (загляните в System.Безопасность.Криптография.Защищенные данные для зашифрованного хранения реестра).
Другие советы
попробуй это
WebRequest request = WebRequest.Create( "http://server/file.xml" );
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "user", "pass" );
request.GetResponse();