Как настроить защищенную службу WCF за брандмауэром? - PullRequest
3 голосов
/ 12 февраля 2009

У меня есть служба WCF, которая находится за брандмауэром корпоративного класса, который выполняет преобразование как имени хоста, так и порта, например ::

https://ws.address.com/Service.svc -> https://serv.internal.com:44000/Service.svc

Служба защищена с помощью SSL-128 и требует сертификата клиента.

Поскольку внутреннее имя сервера недоступно извне брандмауэра, нам пришлось реализовать ServiceHostFactory для преобразования ссылок импорта WSDL и XSD, которые генерирует WCF:

public class MyCustomFactory : ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(
            Type serviceType, Uri[] baseAddresses)
        {
            MyCustomHost customServiceHost = 
                new MyCustomHost(serviceType, baseAddresses);

            return customServiceHost;
        }

        class MyCustomHost : ServiceHost
        {
            public MyCustomHost(Type serviceType, 
                params Uri[] baseAddresses)
                : base(serviceType, 
                    GetBaseAddresses(serviceType, baseAddresses))
            {                
            }

            protected override void ApplyConfiguration()
            {
                base.ApplyConfiguration();
            }

            private static Uri[] GetBaseAddresses(
                Type serviceType, params Uri[] baseAddresses)
            {
                UriBuilder newBaseAddress = new UriBuilder();
                newBaseAddress.Path = "/" + serviceType.ToString() + 
                    ".svc";

                // from config
                newBaseAddress.Host = 
                    MyCustomSettings.ServiceBaseAddress; 

                if (baseAddresses.Length > 0)
                {
                    newBaseAddress.Scheme = baseAddresses[0].Scheme;
                }

                return new Uri[] { newBaseAddress.Uri };
            }
        }
    }

Вот проблема с этим: если служба не размещена на внутренней машине через порт SSL по умолчанию 443, мы получим ошибку:

Ни одна привязка протокола не соответствует данному адресу 'https://ws.address.com/Service.svc'. Связывания протокола настраиваются на уровне узла в конфигурации IIS или WAS.

Из переделок получается, что если мы изменим внутренний сервер для размещения службы на 443 или настроим брандмауэр для пересылки с 44000 на 44000, все будет работать. Это не варианты в нашей производственной среде.

Редактировать: Забыл упомянуть, мы пытались использовать IWsdlExportExtension для выравнивания WSDL, но это вызывало серьезные проблемы с генерацией прокси-кода в svcutil или VS2008, поэтому мы отказались идея.

Кто-нибудь знает как-нибудь обойти это? Я выдергиваю волосы!

Заранее спасибо!

Ответы [ 5 ]

1 голос
/ 12 февраля 2009

Вам может понадобиться явно создать собственную привязку (то есть ServiceModel.WSHttpBinding) и добавить конечную точку службы (.AddServiceEndpoint (..)) с этой привязкой.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.addserviceendpoint(VS.85).aspx

0 голосов
/ 05 февраля 2014

Я предполагаю, что привязки сайтов сайта, на котором размещается ваша служба в IIS, настроены на прослушивание только имени хоста serv.internal.com вместо внешнего имени ws.address.com .

Если привязки сайта IIS настроены с именем хоста, это имя хоста проверяется по всем входящим URL-адресам. Эта привязка может обрабатывать только URL с соответствующим именем хоста.

Брандмауэр перенаправит запрос на внутренний сервер, но не изменит входящую строку URL ...

0 голосов
/ 02 сентября 2009

Вы не упомянули своего хозяина. IIS / WAS? В этом случае вам может потребоваться добавить имя внешнего хоста в конфигурацию IIS в список безопасных привязок.

вот некоторая информация об изменении имени хоста в службе IIS

вот командная строка:

cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs 
set W3SVC/1/SecureBindings  "10.(internal addr).1:443:ws.address.com"
"127.0.0.1:443:Internal Host name"

Если это не поможет, я воспользуюсь «routeNpingme» и предложу вам просто правильно указать конечные точки, используя привязку, которая задает порты и имена https. Я думаю, что вы можете сделать это с существующими параметрами привязки ... но вам может потребоваться создать пользовательский.

0 голосов
/ 30 августа 2009

Вы не должны менять базовые адреса на заводе. Вместо этого напишите расширение, чтобы изменить WSDL. Это будет «IWsdlExportExtension», и вы хотите перезаписать ExportEndpoint, чтобы изменить адреса конечных точек. Это позволит вашей службе прослушивать правильный базовый адрес.

OR

Если вы не хотите начинать с расширения WSDL ... переместите существующий код в метод «CreateServiceHost» и удалите свой собственный хост! Это не очень хорошо, но должно работать.

0 голосов
/ 05 августа 2009

Вы пытались поместить IP-порт в адрес (из вопроса он не выглядел так, как будто его использовали каждый раз):

https://ws.address.com:44000/Service.svc

Еще одна вещь, это может быть, WCF прослушивает трафик https на этот порт, см .:

http://msdn.microsoft.com/en-us/library/ms733768.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...