Ручная адресация с безопасным customBinding на сервисе WCF
Я разрабатываю веб-сервис для 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
элемент недоступен.
спасибо много, походка.
Кстати, я знаю, как установить wsa:To
в коде, но он теряется в ответе кодирования, если я не могу перейти к ручной адресации..
1 ответ
Проверьте Блог Николая Аллена Индиго на Ручной Обращении. Резюме; не все транспорты поддерживают ручную адресацию. Если опция доступна на транспорте, есть 3 шага, чтобы заставить его работать.
Во-первых, убедитесь, что используемый вами транспорт поддерживает некоторую форму ручной адресации. Если нет, то вам не повезло с точки зрения отправки сообщений в разные пункты назначения без создания какого-либо нового объекта для каждого пункта назначения. Во-вторых, включите эту опцию ручной адресации, чтобы предотвратить автоматическое применение адресации заголовков во время отправки сообщений. В-третьих, используйте любой метод, которым хотите применить свои собственные заголовки адресации к исходящему сообщению. Если вы просто делаете сервисные вызовы на прокси-сервере, вам нужно использовать что-то вроде этого:
OperationContext.Current.OutgoingMessageHeaders.To = this.replyTo.Uri;