C# WCF 模拟不适用于网络目录的 Directory.Exists

C# WCF impersonation does not work with Directory.Exists of network direcotory

我有 WCF 服务,它使用 Directory.Exists 方法检查目录是否存在(该目录位于网络服务器上)。之后它会做一些随机的事情。此服务使用客户端模拟。我已经对其进行了测试,并使用 WindowsIdentity.GetCurrent().Name 显示了正确的用户名。我的客户端应用程序是简单的控制台应用程序。

所以我的问题是,当我使用凭据 A 从计算机 A 调用在计算机 A 上运行的服务时,它可以正常工作。如果我使用凭证 A 或 B(或任何其他凭证)从计算机 B 调用它,它就不再工作了。 Directory.Exits return 错误。但是,用户 A 和 B 都拥有 access/modify 这个目录的所有权限。

请注意目录位于计算机 C 上。出于调试原因,我 return 当前用户身份名称,它始终是它应该的名称。显然,如果客户端应用程序与服务位于同一台计算机上,则 Directory.Exits 的凭据不会按应有的方式传递。

欢迎任何帮助或想法。

然后你可以按照这个(这可能是 Kerberos 问题):

http://blogs.msdn.com/b/distributedworld/archive/2012/04/24/troubleshoot-kerberos-in-wcf.aspx

它可能有点旧,但我记得过去遇到过同样的问题。

您期望凭据应该在秒 "hop" 之前传递是错误的 - 服务器无法使用常规 Windows 身份验证将模拟传递给另一台服务器。

为什么您看到 A->A->C 正常工作 - 您的凭据没有离开您最初登录的框 (A),并且仍然有一个 "hop" 到 C 以检查那里的文件系统。

A->B->C 案例不起作用,因为 "hop" 在 A->B 部分期间用于 B 上的模拟,因此对于 B->C,您的凭据不再可以使用。

常见修复:

  • 运行 B 上本地验证凭据(即进程凭据)下的目录访问代码
  • 使用 Kerberos (How can I fix the Kerberos double-hop issue?)

进一步阅读 - 搜索 "NTML one-hop" or "double-hop authentication in Windows" to find articles like http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx