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