我看过很多关于模拟的 WCF 双跳问题的帖子,但没有一个专门帮助我解决我的问题。
我错过了什么?为了在服务 2 上保留我的模拟用户 (DOMAIN\UserName),我还需要做什么?我正在查看 ServiceSecurityContext.Current.WindowsIdentity.Name 以确认 - 也许那是错误的。
设置:
- 托管在 localhost IIS 中的客户端应用程序具有对服务 1 的服务引用 - 模拟 WindowsIdentity (DOMAIN\UserName)
- 服务 1 - 托管在 localhost IIS 中的 WCF 服务,服务引用到服务 2
- 服务 2 - 托管在 localhost IIS 中的 WCF 服务
我正在使用所有 basicHttpBindings 来保持简单。我在两个服务端点上都设置了 SPN。
- 我可以成功地进行双跳并且代码执行得很好
- 在服务 1(跃点 1)中,我的 ServiceSecurityContext.Current.WindowsIdentity 是我模拟的人(DOMAIN\UserName)
- 在服务 2(跃点 2)中,我的 ServiceSecurityContext.Current.WindowsIdentity 是 IIS 应用程序池用户
- ImpersonationLevel = "委托"
- 两个 WCF 服务都启用了 Windows 身份验证并禁用了匿名
** 注意:我在我的开发盒上本地运行这一切。即便如此,我已经将我的授权级别设置为允许我自己授权给我自己。也许矫枉过正。
绑定(两种服务类似):
<binding name="...">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
我在 WCF 服务客户端和服务端点行为配置上都设置了 impersonationLevel = "Delegation"。我的服务方法专门用 impersonationOption="Allowed" (hop 1) 和 impersonationOption"Required" (hop 2) 装饰。