2009-08-07 3 views
6

У меня возникли трудности с подключением к стороннему веб-сервису WSE 3.0 от клиента WCF. Я реализовал пользовательский класс связывания, как указано в этой статье KB:Подключение к веб-службе WSE 3.0 от клиента WCF

http://msdn.microsoft.com/en-us/library/ms734745.aspx

Проблема, кажется, что нужно сделать с утверждением безопасности, используемой веб-службы - UsernameOverTransport.

При попытке вызвать метод, я получаю следующее исключение:

System.InvalidOperationException:. В 'WseHttpBinding' '[имена] обязательный для 'MyWebServiceSoap'' [. namespace] ' договор сконфигурирован с использованием режима аутентификации , который требует целостности уровня транспорта и конфиденциальности. Однако транспортный не может обеспечить целостность и конфиденциальность ..

Он ожидает имя пользователя, пароль и CN номер. В примере кода, предоставленном нам поставщиком, эти учетные данные поставляются в Microsoft.Web.Services3.Security.Tokens.UsernameToken. Вот пример поставляется продавцом:


Это прекрасно работает с 2.0 приложения ж/WSE 3.0 установлен. Вот фрагмент кода из моего клиента WCF:

EndpointAddress address = new EndpointAddress(new Uri("<web service uri here>")); 

WseHttpBinding binding = new WseHttpBinding(); // This is the custom binding I created per the MS KB article 

binding.SecurityAssertion = WseSecurityAssertion.UsernameOverTransport; 
binding.EstablishSecurityContext = false; 

// Not sure about the value of either of these next two 
binding.RequireDerivedKeys = true; 
binding.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt; 

MembershipServiceSoapClient proxy = new MembershipServiceSoapClient(binding, address); 

// This is where I believe the problem lies – I can’t seem to properly setup the security credentials the web service is expecting 

proxy.ClientCredentials.UserName.UserName = "username"; 
proxy.ClientCredentials.UserName.Password = "pwd"; 
// How do I supply the CN number?      

MyObject mo = proxy.MyMethod(); // this throws the exception 

Я рыскал в Интернете в поисках ответа на этот вопрос. Некоторые источники меня закрывают (например, в статье MS KB), но я не могу справиться с горбом. Кто-нибудь может мне помочь?

+0

Просто убедитесь, что ваша сторонняя сторона знает, что WSE устарела? –

+0

Удалось ли вам это решить? У кого-нибудь есть идея? Я сейчас застрял на одном и том же. –

ответ

1

Сообщение об ошибке относится к Уровень транспорта Безопасность, это обычно означает https.

Вы не указали свои файлы конфигурации. Но я предполагаю, что вы настроили безопасность для транспорта (или это требуется как совпадение другого выбора) и использовали адрес http, а не https.

+0

Привет, Шираз, спасибо, что ответили. Я определяю SecurityAssertion как UserNameOverTransport программно в вышеприведенном коде. Веб-служба не использует https, поэтому я не считаю, что это проблема. – 2009-08-12 20:13:33

+0

Я думаю, что именно поэтому вы получаете ошибку. Вы отправляете имя пользователя/пароль над транспортом, WCF затем видит, что пароль будет проходить по незашифрованному кабелю и отказывается запускать службу. –

+0

Похоже, что это будет существенное различие между WSE3.0 и WCF. Я могу использовать клиент WSE 3.0 без SSL для подключения к моей службе WSE3, но клиент WCF не будет подключаться к тому же сообщению, которое Дэйв получил в своем примере. –

9

Я имел успех в подобном случае со следующей конфигурацией: связывающего

<bindings> 
    <customBinding> 
     <binding name="FNCEWS40MTOMBinding"> 
     <security enableUnsecuredResponse="true" authenticationMode="UserNameOverTransport" 
        allowInsecureTransport="true" messageProtectionOrder="SignBeforeEncrypt"> 
      <secureConversationBootstrap /> 
     </security> 
     <mtomMessageEncoding messageVersion="Soap12WSAddressingAugust2004" 
           maxBufferSize="2147483647" /> 
     <httpTransport maxReceivedMessageSize="2147483647" /> 
    </binding> 
    </customBinding> 
</bindings> 

Надеется, что это работает для вас тоже.