2

我看过很多关于模拟的 WCF 双跳问题的帖子,但没有一个专门帮助我解决我的问题。

我错过了什么?为了在服务 2 上保留我的模拟用户 (DOMAIN\UserName),我还需要做什么?我正在查看 ServiceSecurityContext.Current.WindowsIdentity.Name 以确认 - 也许那是错误的。

设置:

  1. 托管在 localhost IIS 中的客户端应用程序具有对服务 1 的服务引用 - 模拟 WindowsIdentity (DOMAIN\UserName)
  2. 服务 1 - 托管在 localhost IIS 中的 WCF 服务,服务引用到服务 2
  3. 服务 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) 装饰。

4

1 回答 1

1

事实证明,在我的案例中,关键部分是确保设置了以下行为属性:

<serviceAuthorization impersonateCallerForAllOperations="true" />

以前,当我设置此值时,我在实体框架中收到错误,因此我取消了设置。似乎在将我的设置与标准实现(如其他 varios 帖子中所述)对齐的某个地方,我最终能够设置此属性并使其按预期工作。

编辑:如果这一切都在本地工作,但在分布式环境中不起作用,请查看这篇文章:如何修复 Kerberos 双跳问题?. 您可能需要将机器设置为相互信任委托。

于 2013-03-19T14:17:18.710 回答