私は、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.SecurityChannelFactory
1.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 で大きな変更がありました。
したがって、すべての承認が機能します。クライアントによって受け入れられているトークンに問題があるだけですか?