Проблемы с запуском службы Secure WCF в DMZ - PullRequest
2 голосов
/ 14 декабря 2009

У меня возникли проблемы с двумя веб-приложениями, которые взаимодействуют друг с другом с помощью служб WCF. Это мой сценарий:

  • Веб-приложение «А» развернуто на сервере корпоративной интрасети и является частью домена «интрасеть»
  • Веб-приложение «B» развернуто на сервере демилитаризованной зоны, подключено к Интернету и является частью домена «экстрасеть»
  • Межсетевой экран находится между двумя доменами, и нет никаких доверительных отношений.
  • «A» вызывает некоторые службы WCF в «B», используя wsHttpBinding
  • Службы WCF в «B» защищены с помощью SSL на IIS.
  • Мы используем поведение аутентификации имени пользователя для аутентификации "A"

это конфигурация привязки сервера:

">

<binding name="UsernameWithTransport">
  <security mode="TransportWithMessageCredential">
    <message clientCredentialType="UserName"
      negotiateServiceCredential="false" />
  </security>
</binding>   </wsHttpBinding>

» Кажется, все отлично работает в моей тестовой среде, которая имеет два домена, как в производстве. Тем не менее, в производственной среде я получаю ужасную ошибку каждый раз, когда «A» вызывает «B»:


    System.ServiceModel.Security.MessageSecurityException: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail. ---> System.ServiceModel.FaultException: An error occurred when verifying security for the message.

Server stack trace: 
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan timeout)
at System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

Сначала я подумал, что это проблема синхронизации часов между серверами, поскольку я мог воспроизвести то же исключение в тестовой среде, изменив часы с разницей в 10 минут. К сожалению, это, похоже, не проблема, потому что наши производственные серверы синхронизированы.

Любая информация будет оценена !!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2009

Для типов учетных данных клиента Аноним, Имя пользователя или Сертификат, если для этого свойства задано значение false [gotiateservicecredential], это означает, что сертификат службы должен быть доступен на клиенте вне диапазона и что клиент должен указать сертификат службы для использования.

http://msdn.microsoft.com/en-us/library/system.servicemodel.messagesecurityoverhttp.negotiateservicecredential.aspx

0 голосов
/ 14 декабря 2009

Наконец-то мы смогли решить проблему, и из-за отсутствия разрешений удостоверение пула приложений не смогло записать в «C: \ Windows \ Temp».

Кажется, что MessageSecurityException является общим видом исключения и может быть вызвано для многих проблем. Чтобы узнать настоящее исключение, мы добавили поведение serviceDebug в конфигурацию службы и проследили за просмотром событий для получения подробной информации об ошибке.

Это конфигурация отладки:


<serviceBehaviors>
<behavior name="ServiceBehavior">
 <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
 <serviceDebug includeExceptionDetailInFaults="true" />
 <serviceSecurityAudit auditLogLocation="Application"
  suppressAuditFailure="false"
  serviceAuthorizationAuditLevel="None"
  messageAuthenticationAuditLevel="SuccessOrFailure" />
</behavior>


В любом случае, спасибо!

...