سؤال

أواجه بعض المشاكل مع تطبيقين ويب يقوم بتوصيل بعضهما البعض باستخدام خدمات WCF. هذا هو سيناريو الخاص بي:

  • يتم نشر تطبيق الويب "A" في خادم إنترانت الشركة وجزء من المجال "الإنترانت"
  • يتم نشر تطبيق الويب "B" في خادم DMZ، الذي يتعرض للإنترنت وجزء من المجال "Extranet"
  • جدار حماية بين النطيتين، ولا توجد علاقة ثقة.
  • "A" يدعو بعض خدمات WCF في "B"، باستخدام Wshttpginding
  • خدمات WCF في "B" هي مضمونة نقل تحت SSL على IIS.
  • نحن نستخدم سلوك مصادقة اسم المستخدم لمصادقة "A"

هذا هو تكوين خادم ملزم الخادم:

">

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

"يبدو أن كل شيء يبدو جيدا في بيئة الاختبار الخاصة بي، والتي لها مجالات مثل الإنتاج. ومع ذلك في بيئة الإنتاج أحصل على خطأ قبيح في كل مرة" مكالمات "ب" ب "هي:


    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 دقائق. لسوء الحظ، هذا لا يبدو أن المشكلة تسبب خوادم الإنتاج لدينا في مزامنة.

سيتم تقدير أي معلومات !!

هل كانت مفيدة؟

المحلول

أخيرا، يمكننا أن نحفظ المشكلة، وكان هوية تجمع التطبيقات غير قادر على الكتابة في "C: Windows Temp" بسبب نقص الأذونات.

يبدو أن رسائل الرسائل إنسانية هو نوع عام من الاستثناء ويمكن إلقاؤه للعديد من المشاكل. لمعرفة الاستثناء الحقيقي، أضفنا سلوك Servicedebug لخدمة التكوين ومشاهدة EventViewer للحصول على معلومات مفصلة حول الخطأ.

هذا هو Credug Config:


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


شكرا على كل حال!

نصائح أخرى

بالنسبة إلى الأنواع المجهولة واسم المستخدم أو شهادة اعتماد عميل، قم بتعيين هذه الخاصية [التفاوضات Cercificecredential] إلى FALST يعني أن شهادة الخدمة يجب أن تكون متاحة في العميل خارج النطاق وأنه يجب على العميل تحديد شهادة الخدمة لاستخدامها.

http://msdn.microsoft.com/en-us/library/system.servicemodel.messagesceroverhttp.negotiateservicecredental.aspx.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top