2012-01-23 4 views
1

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

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

<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, но получить потерянное на ответ кодирования, если я не могу перейти к ручной адресации ..

+0

Вы получили его? –

ответ

0

Отъезд Nicholas Allen's Indigo Blog on Manual Addressing. Резюме; не все из них поддерживают ручную адресацию. Если опция доступна на транспорте, есть 3 шага, чтобы заставить ее работать.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^