У меня возникли проблемы с двумя веб-приложениями, которые взаимодействуют друг с другом с помощью служб 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 минут.
К сожалению, это, похоже, не проблема, потому что наши производственные серверы синхронизированы.
Любая информация будет оценена !!