【问题标题】:how to impersonate client side of wcf call如何模拟 wcf 调用的客户端
【发布时间】:2010-11-07 23:02:09
【问题描述】:

我需要一些关于 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:安全包中没有可用的凭据

调用栈: 在 System.IdentityModel.SspiWrapper.AcquireCredentialsHandle(字符串包,CredentialUse 意图,AuthIdentityEx& authdata) 在 System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(字符串包,NetworkCredential 凭据,布尔 isServer,字符串 [] additionalPackages) 在 System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(SecurityBindingElement sbe,ClientCredentials clientCredentials) 在 System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(SecurityBindingElement sbe,BindingContext 上下文) 在 System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.OnOpening() 在 System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpening() 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(时间跨度超时) 在 System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider,TimeSpan 超时) 在 System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 System.ServiceModel.Channels.ServiceChannel.OnOpen(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel 通道,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan 超时,CallOnceManager 级联) 在 System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度超时) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

感谢任何帮助 马丁

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

【问题讨论】:

    标签: wcf security impersonation


    【解决方案1】:

    必须允许运行 Windows 服务的用户模拟用户。

    有一个权限叫做“身份验证后模拟客户端”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多