Добавление прокси в любое приложение на IIS +9


В корпоративной среде часто возникает необходимость в веб-приложении на asp.net реализовать возможность выхода через прокси сервер (даже с авторизацией) для скачивания той или иной информации.

Например:

  • Реализуемое ПО требует на уровне приложения-сервера скачивать с веб ресурсов ту или иную информацию
  • При размещении любой CMS требуется возможность для подключения приложения к репозиторию разработчиков для скачивания тем, плагинов и т.п. (некоторые CMS вообще не устанавливаются без предварительной авторизации на стороне сервера разработчиков)
  • В SharePoint есть множество сервисов, которые требуют прямого подключения к сайтам Microsoft (пример подключение к office.com для установки внешних приложений)

Рассмотрим 2 ситуации, ориентируясь на статью MSDN:


1) Корпоративный прокси не требует авторизации


В web.config добавляем раздел defaultProxy с указанием прокси сервера.

Подробнее + код
Убедитесь в том, что вы добавляете данный раздел в раздел configuration и также после подраздела configSections, если он присутствует. Для параметра proxyaddress укажите правильный адрес вашего прокси.

<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




К сожалению, не доступен сервер mySQL