Подключение к веб-службе WSE 3.0 с клиента WCF - PullRequest
6 голосов
/ 07 августа 2009

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

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

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

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

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

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

MyWebServiceWse proxy = new MyWebServiceWse();

UsernameToken token = new UsernameToken("Username", "password", PasswordOption.SendPlainText);

token.Id = "<supplied CN Number>";

proxy.SetClientCredential(token);

proxy.SetPolicy(new Policy(new UsernameOverTransportAssertion(), new RequireActionHeaderAssertion()));

MyObject mo = proxy.MyMethod();

Это прекрасно работает с установленным приложением 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), но я не могу справиться с этим. Кто-нибудь может мне помочь?

Ответы [ 2 ]

9 голосов
/ 11 октября 2011

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

<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>

Надеюсь, это сработает и у вас.

1 голос
/ 10 августа 2009

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

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

...