2010-01-29 3 views
2

Этот вопрос, который уже обсуждался несколько раз на SO, но я не смог найти подходящего решения для моей проблемы. У меня есть служба WCF, размещенная на внешнем сервере (другой домен), и я пытаюсь ее использовать из приложения командной строки. Я получаю следующее сообщение об ошибке:Ошибка аутентификации между клиентом и службой WCF

The request for security token could not be satisfied because authentication failed. 

Услуга конфигурируется в файле web.config:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBinding_IRun"> 
      <security mode="None"> 
      <message clientCredentialType="None" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment> 
     <baseAddressPrefixFilters> 
     <add prefix="http://www.domain.net"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="calculadora.SOA.RunBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="calculadora.SOA.RunBehavior" name="calculadora.SOA.Run"> 
     <endpoint address="http://www.domain.net/calculadora/SOA/run.svc" binding="wsHttpBinding" contract="calculadora.SOA.IRun"> 
      <identity> 
      <dns value="domain.net"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
</system.serviceModel> 

На стороне клиента, я создаю пользовательские привязки для подключения к услуге. Вот конфигурация безопасности:

standardBinding.Security.Mode = SecurityMode.None; 
standardBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
standardBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
standardBinding.Security.Transport.Realm = ""; 
standardBinding.Security.Message.ClientCredentialType = MessageCredentialType.None; 
standardBinding.Security.Message.NegotiateServiceCredential = false; 
standardBinding.Security.Message.EstablishSecurityContext = false; 
standardBinding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default; 

Я не использую любой механизм безопасности для аутентификации, но тем не менее, сервис, кажется, ожидает один. При работе в разных доменах необходимо ли использовать базовую аутентификацию?

EDIT: Я не ссылался на какую-либо привязку к моей конечной точке. После того, как ссылка была установлена, я получил еще одну ошибку сообщения:

{"The message with Action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue' cannot be processed at the 
receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract 
mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the 
receiver. Check that sender and receiver have the same contract and the same binding (including security 
requirements, e.g. Message, Transport, None)."} 

Проблема была вызвана связыванием моего клиента. Пока я создавал свое обязательное связывание с использованием стандартного WSHttpBinding, для свойства «SecurityMode» вместо «Нет» было установлено «Сообщение». Теперь код выглядит следующим образом, и сервис, наконец, работает:

WSHttpBinding standardBinding = new WSHttpBinding(SecurityMode.None, false); 
CustomBinding myCustomBinding = new CustomBinding(standardBinding); 

Большое спасибо marc_s!

ответ

2

Я думаю, что проблема заключается в вашем сервисе определение конечной точки:

<endpoint address="http://www.domain.net/calculadora/SOA/run.svc" 
      binding="wsHttpBinding" contract="calculadora.SOA.IRun"> 

Вы используете стандартный WsHttpBinding - который по умолчанию интегрированной безопасности Windows, как безопасность сообщений.

Пока вы определяете конфигурацию привязки (так называемый wsHttpBinding_IRun), вы не являетесь , ссылаясь на в своем определении конечной точки - таким образом, он не вступает в игру. Вам нужно расширить определение конечной точки сервиса с атрибутом bindingConfiguration следующим образом:

<endpoint address="http://www.domain.net/calculadora/SOA/run.svc" 
      binding="wsHttpBinding" 
      bindingConfiguration="wsHttpBinding_IRun" 
      contract="calculadora.SOA.IRun"> 

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

+1

Большое спасибо marc_s за ваше время! Теперь я получаю новое сообщение об ошибке: «Сообщение с действием (...) не может быть обработано в приемнике из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за ...». Я уже дважды проверял настройки, и все, кажется, в порядке. Вы хоть представляете, что может быть неправильным? Я буду продолжать смотреть. – jdecuyper

0

Я столкнулся с тем же вопросом и после того, как весь день вложил деньги, я наконец выясню, как исправить. Ключ помещается в тег сообщения installedSecurityContext = "false".

<security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="UserName" establishSecurityContext="false" /> 
     </security> 
+0

По вопросу он уже поставил переменную 'installSecurityContext' в' false'. –

Смежные вопросы