8

私は、WIF と STS プロバイダーを使用してすべて保護されたいくつかの WCF サービスを使用しています (すべて、すぐに使用できる Microsoft コードとサンプルを使用しています)。これらのサービスはすべて .NET 3.5 を使用して構築され、最近 .NET 4.0 に更新されました。サービスに関連付けられているすべての .dll も 4.0 に更新されています。これらのサービスは、私がフレームワークのバージョンを更新するまで、何年もの間そのままで機能していました。

問題は、STS WCF サービスによって保護された WCF サービスを呼び出すと、STS によって保護された WCF サービスを呼び出したクライアント アプリケーションにトークンが渡された後にエラーが生成されることです。

保護されていない、または誤って保護された障害が相手から受信されました。障害コードと詳細については、内部の FaultException を参照してください。

HResult -2146233087

{"メッセージ内のセキュリティ トークンの処理中にエラーが発生しました。"}

サーバー スタック トレース: System.ServiceModel.Channels.SecurityChannelFactory で1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory1.System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation での SecurityRequestChannel.Request (メッセージ メッセージ、TimeSpan タイムアウト) (SecuritySessionOperation 操作、EndpointAddress ターゲット、Uri via、SecurityToken currentToken、TimeSpan タイムアウト) System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan) でtimeout) で System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan タイムアウト) で System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan タイムアウト) で System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan タイムアウト) で System. .ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan タイムアウト)
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan タイムアウト) で System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call (ServiceChannel チャネル、TimeSpan タイムアウト) で System.ServiceModel.Channels. System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan タイムアウト) での ServiceChannel.CallOnceManager.CallOnce(TimeSpan タイムアウト、CallOnceManager カスケード) System.ServiceModel.Channels.ServiceChannel.Call(String アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins 、Object[] outs、TimeSpan timeout) で System.ServiceModel.Channels.ServiceChannel.Call(String アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs) で System.ServiceModel.Channels.ServiceChannelProxy.System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) での InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作)

[0] で例外が再スローされました。 c:\Projects\Proxy.cs:line 36 の MyProject.Proxy.GetInfo() での GetInfo()

さらに掘り下げると、次のことも示されます。

InnerException.Code.Subcode.Nameプロパティ値として無効なSecurityToken。

そのため、システムの時計に問題があることを示唆する次のことを調べましたが、どれも機能していません。


(SAML を使用する場合) http
://blogs. msdn.com/b/xiaowen/archive/2009/03/26/tip-add-a-clock-skew-to-prevent-some-security-faults.aspx?Redirected=true

これらのサービスでデバッガーにアタッチし、コードをウォークスルーしようとしましたが、原因が見つかりません。これでどこが間違っているのか誰か知っていますか?

編集:興味深いのは、認証作業を行う STS サービスの WIF の難しい部分です! ロギングを有効にしており、以下がキャプチャされます。

Service authorization succeeded.  
Service: http:// localhost:4068 /MyID/MyID.svc  
Action: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue  
ClientIdentity: Domain\allen; S-1-5-21-1234567890-1234567895-0987654321-45678 
AuthorizationContext: uuid-22fad22a-22fe-123c-9b69-a22c23f569ce-99 
ActivityId: <null>  
ServiceAuthorizationManager: <default>

.configまた、.svc ファイルを確認するために WCF ログを有効にしましたが、問題を特定するエラー情報は得られませんでした。STS が言うように、「あなたは認証されました。私たちはあなたを渡し、トークンを生成しました。これで完了です!」呼び出し元のクライアントがトークンを気に入らないようです。ただし、フレームワークのバージョンを変更するまで、これは長い間機能していました。私の知る限り、3.5 から 4.0 への大きな WIF の変更はありませんでしたが、WIF がフレームワークに統合された 4.5 で大きな変更がありました。

したがって、すべての承認が機能します。クライアントによって受け入れられているトークンに問題があるだけですか?

4

2 に答える 2

2

まず、トレース オプションはどこにあるのでしょうか。System.ServiceModel のみをトレースしても、十分な情報が得られない場合があります。少なくとも、System.ServiceModel.Activation を追加し、おそらく WIF に関連するものをいくつか追加する必要があります (私なら System.Security を追加します)。

STS を使用し、Java クライアントを .net サーバーに統合すると、非常によく似たエラーが発生しました。これが私がそれを解決した方法です。

  1. サービスの新しいクライアントを構築し、サーバーに接続します。Fiddler でメッセージを監視する
  2. 現在のクライアントで同じことを行います
  3. 送信されたメッセージを比較します。WCF トレース ログからそれらを取得できることは知っていますが、私はフィドラーの方が好きです。

私のケースでは、トレースとメッセージ インスペクションを組み合わせることで、エラーを見つけることができました (Java クライアントでのポリシー エラー、およびサービス カスタム セキュリティ ポリシーでの愚かなコード エラー)。

お役に立てれば!

編集

system.servicemodel.activation を除くすべてのトレース アクティビティを設定するリンクを次に示します。重宝するかも

http://msdn.microsoft.com/en-us/library/ee517292.aspx

于 2013-12-16T16:17:48.000 に答える