Как программно создать эту пользовательскую привязку?
мы должны получить доступ к веб-службе, которая использует soap11... нет проблем, я просто установлю привязку как:
BasicHttpBinding wsBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
Неа. Без костей. Поэтому я спросил хозяина службы, почему у нас проблемы с аутентификацией, и он сказал, что наша конфигурация должна иметь эту пользовательскую привязку:
<bindings>
<customBinding>
<binding name="lbinding">
<security authenticationMode="UserNameOverTransport"
messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11"
securityHeaderLayout="Strict"
includeTimestamp="false"
requireDerivedKeys="true"
keyEntropyMode="ServerEntropy">
</security>
<textMessageEncoding messageVersion="Soap11" />
<httpsTransport authenticationScheme ="Negotiate" requireClientCertificate ="false" realm =""/>
</binding>
</customBinding>
</bindings>
единственная проблема-мы создаем привязку программно не через конфиг. Поэтому, если кто-то может указать мне в правильном направлении в отношении изменения моего BasicHttpBinding в custombinding, который соответствует .значение конфигурации при условии, что я дам им большую блестящую золотую звезду на день.
2 ответов
решил его!
вот победы код для тех, кто находится в аналогичном положении.
Uri epUri = new Uri(_serviceUri);
CustomBinding binding = new CustomBinding();
SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;
sbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
sbe.IncludeTimestamp = false;
sbe.SetKeyDerivation(true);
sbe.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy;
binding.Elements.Add(sbe);
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8));
binding.Elements.Add(new HttpsTransportBindingElement());
EndpointAddress endPoint = new EndpointAddress(epUri);
@D. Форрест уже нашел решение, но простой способ увидеть, какие объекты задействованы для данной конфигурации WCF, - это вызвать .Endpoint.Binding.CreateBindingElements()
на прокси-сервере клиента, который вы используете. Можно дамп дерева объектов каждого элемента в списке, который возвращается и посмотреть, как настроена привязка.