В корпоративной среде часто возникает необходимость в веб-приложении на asp.net реализовать возможность выхода через прокси сервер (даже с авторизацией) для скачивания той или иной информации.
Например:
- Реализуемое ПО требует на уровне приложения-сервера скачивать с веб ресурсов ту или иную информацию
- При размещении любой CMS требуется возможность для подключения приложения к репозиторию разработчиков для скачивания тем, плагинов и т.п. (некоторые CMS вообще не устанавливаются без предварительной авторизации на стороне сервера разработчиков)
- В SharePoint есть множество сервисов, которые требуют прямого подключения к сайтам Microsoft (пример подключение к office.com для установки внешних приложений)
Рассмотрим 2 ситуации, ориентируясь на статью MSDN:
1) Корпоративный прокси не требует авторизации
В web.config добавляем раздел defaultProxy с указанием прокси сервера.
<configuration>
<system.net>
<defaultProxy useDefaultCredentials="true">
<proxy proxyaddress="http://proxyserver:80" bypassonlocal="true" />
</defaultProxy>
</system.net>
</configuration>
2) Корпоративный прокси требует авторизации
2.1) Авторизуем сервер (кардинальный подход, не всегда удобен и менее безопасен). В данном варианте используются такие же настройки в web.config, как в пункте 1), но также необходимо, чтобы администраторы прокси предоставили доступ для сервера по его ip адресу для определенных веб-ссылок или на весь интернет. Учтите, что часто очень сложно определить, на какие же ссылки пытается получить доступ CMS или SharePoint server.
2.2) Модуль авторизации для веб-приложения
Если обратить пристальное внимание на ту же статью в MSDN то для раздела defaultProxy можно указать дополнительный подраздел module.
Это очень важный раздел, который позволяет создать свой (легко встраиваемый) код доступа к прокси серверу. При этом нет необходимости редактировать код самого приложения.
- В visual studio cоздайте новую библиотеку MyCorpAssembly.dll net 2.0 (чтобы запускалась и в старых сайтах):
- Переименуйте класс в MyCorpProxy:
- Добавьте следующий код: Не забудьте указать свои строки для «user», «password»,«domain» и «my.proxy:8080». В данном примере пароль хранится в открытом виде, вы же можете получать и хранить его каким угодно секретным способом.
Также лучше создать сервисную, доменную запись для авторизации.
using System; using System.Collections.Generic; using System.Net; using System.Text; namespace MyCorpAssembly { public class MyCorpProxy : IWebProxy { public ICredentials Credentials { get { return new NetworkCredential("user", "password","domain"); } set { } } public Uri GetProxy(Uri destination) { return new Uri("http://my.proxy:8080"); } public bool IsBypassed(Uri host) { return false; } } }
- Подпишите библиотеку своим ключом:
- Скомпилируйте и положите получившийся MyCorpAssembly.dll в bin папку сайта
- Добавьте в web.config сайта новый раздел defaultProxy:
<system.net> <defaultProxy enabled="true" useDefaultCredentials="false"> <module type = "MyCorpAssembly.MyCorpProxy, MyCorpAssembly" /> </defaultProxy> </system.net>
- Можете перезапускать приложение IIS и проверять доступность внешних ресурсов.
Думаю, такой же функционал может работать и для приложений, написанных на .net, но я не проверял.
Просто в папке рядом с приложением необходимо создать AppName.exe.Config файл и добавить туда раздел defaultProxy
Автор: Omankit