Ручная адресация с безопасным customBinding на сервисе WCF - PullRequest
1 голос
/ 23 января 2012

Я разрабатываю веб-сервис для внешнего WSDL. Доступ осуществляется с помощью HTTP / S (сертификаты сервера и клиента), и запрос и ответ подписываются соответствующим сертификатом. Я импортировал WSDL в VS2010 со ссылкой на службу и добавил подпись к MessageContracts, настроил файл конфигурации для обеспечения безопасности и https и настроил SSL для порта. Я близок к тому, чтобы заставить его работать, но мне нужно включить ручную адресацию, чтобы вставить элемент wsa:To в ответ, но я не могу понять, как заставить это работать ... Любая помощь приветствуется.

Вот мой текущий раздел конфигурации:

<bindings>
  <customBinding>
    <binding name="AfleverServiceSoapBinding_V1_1">
      <security defaultAlgorithmSuite="TripleDesRsa15"
                authenticationMode="MutualCertificateDuplex"
                requireDerivedKeys="false"
                securityHeaderLayout="Lax"
                includeTimestamp="true"
                keyEntropyMode="CombinedEntropy"
                messageProtectionOrder="EncryptBeforeSign"
                messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
                requireSignatureConfirmation="false"
                allowSerializedSigningTokenOnReply="true"
                enableUnsecuredResponse="False">
        <localClientSettings cacheCookies="true"
                             detectReplays="true"
                             replayCacheSize="900000"
                             maxClockSkew="00:05:00"
                             maxCookieCachingTime="10:00:00"
                             replayWindow="00:05:00"
                             sessionKeyRenewalInterval="10:00:00"
                             sessionKeyRolloverInterval="00:05:00"
                             reconnectTransportOnFailure="true"
                             timestampValidityDuration="00:05:00"
                             cookieRenewalThresholdPercentage="60"/>
        <localServiceSettings detectReplays="true"
                              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>
      <mtomMessageEncoding maxReadPoolSize="64"
                           maxWritePoolSize="16"
                           messageVersion="Soap11WSAddressing10"
                           maxBufferSize="65536"
                           writeEncoding="utf-8">
        <readerQuotas maxDepth="32"
                      maxStringContentLength="8192"
                      maxArrayLength="16384"
                      maxBytesPerRead="4096"
                      maxNameTableCharCount="16384" />
      </mtomMessageEncoding>
      <httpsTransport 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"
                      requireClientCertificate="true" />
    </binding>
  </customBinding>
</bindings>

Большая часть этого была сгенерирована автоматически.

Я знаю, что для атрибута manualAddressing в httpsTransport нужно установить значение true, но затем я получаю исключение, потому что эта настройка защищена на уровне сообщений. Кто-нибудь знает, как переключиться на безопасность на транспортном уровне, сохранив при этом остальное? Поскольку это customBinding, атрибут mode в элементе security недоступен.

Thnx много, походка.

Кстати, я знаю, как установить wsa:To в коде, но он теряется в ответе на кодирование, если я не могу перейти к ручной адресации.

1 Ответ

0 голосов
/ 01 января 2013

Ознакомьтесь с блогом Николая Аллена «Индиго» по ручной адресации . Резюме; не все транспорты поддерживают ручную адресацию. Если опция доступна на транспорте, есть 3 шага, чтобы заставить ее работать.

Во-первых, убедитесь, что используемый вами транспорт поддерживает некоторую форму ручной адресации. Если нет, то вам не повезло с точки зрения отправки сообщений в разные пункты назначения без создания какого-либо нового объекта для каждого пункта назначения. Во-вторых, включите эту опцию ручной адресации, чтобы предотвратить автоматическое применение адресации заголовков во время отправки сообщений. В-третьих, используйте любой способ, которым вы хотите применить свои собственные заголовки адресации к исходящему сообщению. Если вы просто делаете сервисные звонки на прокси, вам нужно использовать что-то вроде этого:

OperationContext.Current.OutgoingMessageHeaders.To = this.replyTo.Uri;

...