1

我需要一些关于 WCF 和授权的帮助。目前,我有一个客户端调用作为托管在 Windows 服务中的 .NET 远程处理对象,并且正在调用 WCF 服务(使用 wshttpbinding)。WCF 服务使用基于消息的安全性的 Windows 身份验证。

Windows 服务使用特殊帐户运行。一旦客户端调用到达 .NET 远程处理对象,thread.currentprincipal 就会设置为客户端提供的主体,以便使用来自客户端的凭据执行所有操作。到目前为止没问题,现在我的当前问题出现了:应该使用客户端用户凭据调用 wcf 服务。Afaik WCF 使用 WindowsIdentity.GetCurrent 为调用创建授权信息。由于 Thread.CurrentPrincipal 持有我想用于通话的身份,我认为 (hread.CurrentPrincipal.Identity as WindowsIdentity).Impersonate() 可以完成这项工作。

但现在我得到的不是 WCF 安全异常,而是这个异常: System.ComponentModel.Win32Exception: No credentials are available in the security package

调用堆栈:在 System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle 的 System.IdentityModel.SspiWrapper.AcquireCredentialsHandle(字符串包,CredentialUse 意图,AuthIdentityEx& authdata)处 System.ServiceModel。 Security.SecurityUtils.GetCredentialsHandle(SecurityBindingElement sbe, ClientCredentials clientCredentials) 在 System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(SecurityBindingElement sbe, BindingContext context) 在 System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.OnOpening() 在 System.ServiceModel.Security.WrapperSecurityCommunicationObject。 OnOpening() 在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 System.ServiceModel.Security。CommunicationObjectSecurityTokenProvider.Open(TimeSpan timeout) at System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider, 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) 在 System.ServiceModel。System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannel 的 Channels.ServiceChannel.EnsureOpened(TimeSpan 超时) .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(消息)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage信息)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage信息)

谢谢马丁的任何帮助

编辑:我犯了一个错误,导致这个异常,因为我忘记在模拟后创建通道工厂,但现在我得到另一个异常,我不确定如何处理它:System.IO.FileLoadException:无法加载文件或程序集 'System.IdentityModel.Selectors, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 或其依赖项之一。未提供所需的模拟级别,或者提供的模拟级别无效。(来自 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 回答