2

WCF サービスを使用して相互に通信する 2 つの Web アプリケーションで問題が発生しています。これは私のシナリオです:

  • Web アプリケーション「A」は、企業イントラネットおよびドメイン「イントラネット」の一部のサーバーにデプロイされます。
  • Web アプリケーション「B」は、DMZ のサーバーにデプロイされ、インターネットとドメイン「エクストラネット」の一部に公開されます
  • ファイアウォールは 2 つのドメインの間にあり、信頼関係はありません。
  • "A" は、wsHttpBinding を使用して、"B" でいくつかの WCF サービスを呼び出します。
  • "B" の WCF サービスは、IIS の SSL でトランスポート セキュリティで保護されています。
  • 「A」を認証するためにユーザー名認証動作を使用しています

これはサーバー バインディング構成です。

">

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

本番環境のように 2 つのドメインを持つテスト環境では、すべてが正常に動作しているように見えますが、本番環境では、「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分の違いでクロックを変更することで、テスト環境で同じ例外を再現できたからです。残念ながら、実稼働サーバーが同期しているため、これは問題ではないようです。

どんな情報でも大歓迎です!!

4

2 に答える 2

0

最後に、問題を解決することができました。権限がないため、アプリプールIDが「C:\ Windows\Temp」に書き込めなかったことが原因でした。

MessageSecurityExceptionは一般的な種類の例外であり、多くの問題に対してスローされる可能性があるようです。実際の例外を知るために、serviceDebug動作をservice configに追加し、イベントビューアでエラーの詳細情報を確認しました。

これはデバッグ設定です:


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


とにかくありがとう!

于 2009-12-14T18:11:25.210 に答える
0

匿名、ユーザー名、または証明書のクライアント資格情報の種類の場合、このプロパティ [negotiateservicecredential] を false に設定すると、サービス証明書が帯域外でクライアントで利用できる必要があり、クライアントが使用するサービスの証明書を指定する必要があることを意味します。

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

于 2009-12-17T12:44:02.943 に答える