2011-06-21 11 views
1

私たちのクライアントは同じクロックスキューの問題に直面しています。これは忘れられないものです。somanyotherWCF&クロックスキュー - カスタムバインディング設定が無視されますか?

これらのページの回答とその後のウェブ検索はかなり役に立ちましたが、私は別の問題に直面しました。

ローカルマシンでデバッグを行うと、バインディングのプロパティが正しく設定されていることがわかります。 しかし、ローカルでコードをテストすることはできません(私は1つのクロックしか持っていません)。テストサーバーにサービスを公開する必要があります。しかし、歪んだ時計でサービスに接続すると、私はまだMessageSecurityException秒を受信します。

私の最初の考えは、作成後にバインディングが変更されたことでしたが、私とこのプロジェクトの同僚はバインディングが一度作成され、その後は触れられないことを確認しました。

私は明らかにDoing It Wrong [TM]です。誰かがこの問題について光を当てることができれば、私はとても感謝しています。前もって感謝します。


これは、バインディングを作成するコードです:

WSHttpBinding binding = new WSHttpBinding(); 
binding.Security.Mode = SecurityMode.TransportWithMessageCredential; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 

// ... blah blah ... 

// fix ongoing security 
sbe.LocalClientSettings.DetectReplays = false; 
sbe.LocalClientSettings.MaxClockSkew = TimeSpan.MaxValue; 
sbe.LocalClientSettings.SessionKeyRenewalInterval = TimeSpan.MaxValue; 

sbe.LocalServiceSettings.DetectReplays = false; 
sbe.LocalServiceSettings.MaxClockSkew = TimeSpan.MaxValue; 
sbe.LocalServiceSettings.SessionKeyRenewalInterval = TimeSpan.MaxValue; 

// fix bootstrap security 
SecureConversationSecurityTokenParameters sct = null; 

if (sbe is SymmetricSecurityBindingElement) 
{ 
    SecurityTokenParameters tokenParameters = 
((SymmetricSecurityBindingElement)sbe).ProtectionTokenParameters; 
    if (tokenParameters is SecureConversationSecurityTokenParameters) 
    { 
     sct = tokenParameters as SecureConversationSecurityTokenParameters; 
    } 
} 
else if (sbe is TransportSecurityBindingElement) 
{ 
    sct = sbe.EndpointSupportingTokenParameters 
      .Endorsing 
      .OfType<SecureConversationSecurityTokenParameters>() 
      .FirstOrDefault(); 
} 
else 
{ 
    throw new ArgumentException("Binding has neiter a " + 
     "SymmetricSecurityBindingElement nor " + 
     "TransportSecurityBindingElement"); 
} 

SecurityBindingElement bootbe = sct.BootstrapSecurityBindingElement; 

bootbe.LocalClientSettings.DetectReplays = false; 
bootbe.LocalClientSettings.MaxClockSkew = TimeSpan.MaxValue; 
bootbe.LocalClientSettings.SessionKeyRenewalInterval = TimeSpan.MaxValue; 

bootbe.LocalServiceSettings.DetectReplays = false; 
bootbe.LocalServiceSettings.MaxClockSkew = TimeSpan.MaxValue; 
bootbe.LocalServiceSettings.SessionKeyRenewalInterval = TimeSpan.MaxValue; 

これは、私は、サービストレースログに受け取る例外のコールスタックです:

System.ServiceModel.Security.MessageSecurityException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message&amp; message, TimeSpan timeout) 
System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message&amp; message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates) 
System.ServiceModel.Channels.SecurityChannelListener`1.ServerSecurityChannel`1.VerifyIncomingMessage(Message&amp; message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationState) 
System.ServiceModel.Channels.SecurityChannelListener`1.SecurityReplyChannel.ProcessReceivedRequest(RequestContext requestContext, TimeSpan timeout) 
System.ServiceModel.Channels.SecurityChannelListener`1.ReceiveItemAndVerifySecurityAsyncResult`2.OnInnerReceiveDone() 
System.ServiceModel.Channels.SecurityChannelListener`1.ReceiveItemAndVerifySecurityAsyncResult`2.InnerTryReceiveCompletedCallback(IAsyncResult result) 
System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) 
System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) 
System.Runtime.InputQueue`1.AsyncQueueReader.Set(Item item) 
System.Runtime.InputQueue`1.Dispatch() 
System.Runtime.ActionItem.DefaultActionItem.Invoke() 
System.Runtime.ActionItem.CallbackHelper.InvokeWithoutContext(Object state) 
System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
+0

設定はサービスまたはクライアントに適用されていますか? –

+0

バインディングは、サーバーとクライアントの両方で同じように作成されます。そのため、サービスは 'LocalClientSettings'と' LocalServiceSettings'の両方にオプションを設定します。 – Cornelius

+0

何の例外がありますか? – Shrike

答えて

0

あなたが受け取るべきですMessageSecurityExceptionサーバーとクライアントの時刻がクロックスキュー設定以上に異なるためにメッセージが拒否された場合。あなたの説明を考えれば、あなたが見ているものは期待されるものだと思います。

According to MicrosoftMessageSecurityExceptionはなく、より具体的な何かを返された理由は、

セキュリティ例外は、我々は、セキュリティ層から任意の詳細を公開しないことを決定し、このためにいくつかの非常に機密性の高い情報とによる を公開することができています。 たとえば、 がフォールト例外で公開されているときに、 のサービスのスキュー設定を攻撃者に提供し、詳細な情報を の攻撃に提供すると言われているクロックスキューの問題です。

関連する問題