1

WCF と承認について助けが必要です。現在、Windows サービスでホストされている .NET リモーティング オブジェクトとして呼び出し、WCF サービスを呼び出しているクライアントがあります (wshttpbinding を使用)。WCF サービスは、メッセージ ベースのセキュリティで Windows 認証を使用しています。

Windows サービスは特別なアカウントで実行されています。クライアント呼び出しが .NET リモーティング オブジェクトに到達すると、thread.currentprincipal がクライアントから提供されたプリンシパルに設定されるため、すべてのアクションがクライアントからの資格情報で実行されます。これまでのところ問題はありませんが、ここで現在の問題が発生します。wcf サービスは、クライアント ユーザーの資格情報を使用して呼び出す必要があります。Afaik WCF は WindowsIdentity.GetCurrent を使用して、呼び出しの承認情報を作成します。Thread.CurrentPrincipal は呼び出しに使用したい ID を保持しているので、 (hread.CurrentPrincipal.Identity as WindowsIdentity).Impersonate() が仕事をすると思いました。

しかし今、私は WCF セキュリティ例外の代わりにこの例外を取得しています: System.ComponentModel.Win32Exception: セキュリティ パッケージで利用可能な資格情報はありません

コールスタック: System.IdentityModel.SspiWrapper.AcquireCredentialsHandle (文字列パッケージ、CredentialUse インテント、AuthIdentityEx& authdata) で System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle (文字列パッケージ、NetworkCredential 資格情報、ブール値 isServer、String[] additionalPackages) で System.ServiceModel. System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(SecurityBindingElement sbe、BindingContext コンテキスト) での Security.SecurityUtils.GetCredentialsHandle (SecurityBindingElement sbe、ClientCredentials clientCredentials) System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.OnOpening() で System.ServiceModel.Security.WrapperSecurityCommunicationObject で。 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan タイムアウト) で System.ServiceModel.Security で OnOpening()。CommunicationObjectSecurityTokenProvider.Open(TimeSpan タイムアウト) で System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider, 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.ServiceChannel.CallOnceManager.CallOnce(TimeSpan タイムアウト、CallOnceManager カスケード) で System.ServiceModel.System.ServiceModel.Channels.ServiceChannel.Call での Channels.ServiceChannel.EnsureOpened(TimeSpan タイムアウト) (文字列アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels.ServiceChannelProxy.Invoke( IMessage メッセージ)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)

マーティンの助けを借りてthx

編集:偽装後にchannelfactoryを作成するのを忘れたため、この例外につながる間違いを犯しましたが、別の例外が発生し、対処方法がよくわかりません: System.IO.FileLoadException: ロードできませんでしたファイルまたはアセンブリ 'System.IdentityModel.Selectors, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' またはその依存関係の 1 つ。必要な偽装レベルが指定されていないか、指定された偽装レベルが無効です。(HRESULT からの例外: 0x80070542)

4

1 に答える 1

2

Windows サービスを実行しているユーザーは、ユーザーの偽装を許可されている必要があります。

「認証後にクライアントになりすます」という権利があります

http://blogs.technet.com/askperf/archive/2007/10/16/wmi-troubleshooting-impersonation-rights.aspx

于 2009-07-03T15:14:41.330 に答える