Генерация WSDL для службы WCF за балансировщиком нагрузки

Предыстория:

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

Для службы требуется смешанный режим безопасности, т. е. TransportWithMessageSecurity.

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

Пользовательский элемент HttpTransportBindingElement, в свою очередь, подтверждает платформе, что он способен шифровать и подписывать сообщения... поэтому платформа не будет жаловаться, когда через нее проходит трафик через HTTP, поскольку транспорт утверждает, что он подписывает/шифрует сообщения ... хотя это не так.

( Для всех заинтересованных лиц это было признано приемлемым с точки зрения безопасности, поскольку изначально сообщение должно было прийти через SSL к балансировщику нагрузки... )

Проблема:

Когда мы используем svcutil.exe для создания прокси-сервера клиента, автоматически сгенерированный файл app.config содержит конечную точку службы, адресованную по протоколу HTTP.Это должно быть через HTTPS.

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

Я подозреваю, что это связано с тем, что WSDL, созданный инфраструктурой на сервере, строится с HTTP-адресами вместо HTTPS >, в свою очередь, в результате использования пользовательского элемента HttpTransportBindingElement (как объяснялось выше).

Автоматически созданное приложение.config для клиента:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
    <bindings>
        <customBinding>
            <binding name="myBindingEndpoint">
                <!--    WsdlImporter encountered unrecognized policy assertions in ServiceDescription 'http://tempuri.org/':    -->
                <!--    <wsdl:binding name='myBindingEndpoint'>    -->
                <!--        <sp:HttpToken xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">..</sp:HttpToken>    -->
                <security defaultAlgorithmSuite="Default" authenticationMode="CertificateOverTransport"
                    requireDerivedKeys="true" securityHeaderLayout="Strict" includeTimestamp="true"
                    keyEntropyMode="CombinedEntropy" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
                    <localClientSettings cacheCookies="true" detectReplays="false"
                        replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
                        replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
                        sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
                        timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
                    <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00"
                        maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
                        negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
                        sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
                        reconnectTransportOnFailure="true" maxPendingSessions="128"
                        maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
                    <secureConversationBootstrap />
                </security>
                <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                    messageVersion="Default" writeEncoding="utf-8">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                </textMessageEncoding>
                <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                    maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
                    bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                    keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
                    realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                    useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://myserver/GAEASSLWcfService/ServiceOverSSL.svc"
            binding="customBinding" bindingConfiguration="myBindingEndpoint"
            contract="IServiceOverSSL" name="myBindingEndpoint" />
    </client>
</system.serviceModel>
</configuration>

Обходной путь:

Простое изменение на и переадресация конечных точек для использования HTTPS устраняет проблему.

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

Вопрос:

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

Ссылки: Для тех, кто хочет узнать о решении «службы, стоящей за балансировщиком нагрузки/расшифровщиком ssl» и пользовательском элементе HttpTransportBindingElement, см. этот пост XXX от ZZZ о создании определяемой пользователем привязки, а также этот пост XXX от ZZZ о некоторых из другие проблемы с предоставлением услуг за ускорителем балансировки нагрузки/SSL.

6
задан JTech 5 June 2012 в 16:48
поделиться