在impersonate = true的网站中使用WCF的net.pipe

时间:2010-07-29 21:10:04

标签: wcf wcf-binding named-pipes netnamedpipebinding

我正在尝试在网站中使用WCF命名管道,但它失败并出现错误:

  

net.pipe:// localhost / mypipename没有监听端点   那可以接受这个消息。这通常是由不正确引起的   地址或SOAP操作。有关更多信息,请参阅InnerException(如果存在)   的信息。

和InnerException:

The pipe name could not be obtained for net.pipe://localhost/mypipename.

还有另一个内部异常,提供access denied消息。

我的网站正在使用模拟,并环顾互联网,这似乎是相关的,但我不知道如何解决它。

有没有人有任何想法?

由于 马特

3 个答案:

答案 0 :(得分:7)

标准WCF NetNamedPipesBinding在服务启动时创建随机生成的管道名称,还有一个内核共享内存对象,WCF客户端通道堆栈必须查询该对象以找出管道的名称。

在您的网站上使用模拟意味着从中调用WCF服务的安全上下文具有登录令牌(模拟令牌),其中包括NETWORK USERS组的成员身份。

当服务侦听器启动时,WCF绑定会在命名管道本身以及发布管道名称的共享内存对象上创建访问控制列表(ACL)。这两个ACL都拒绝访问NETWORK USERS组。因此,冒充远程用户的网站在发现管道名称之前就被拒绝访问共享内存对象。即使它以其他方式找到了管道名称,它仍然会被拒绝访问管道。

当您删除模拟时,一切正常,因为现在正在Web应用程序工作进程的安全上下文中调用该服务,其登录令牌没有NETWORK USERS组的成员身份 - 它是本地登录。

如果您有兴趣,可以在http://blogs.charteris.com/blogs/chrisdi了解更多详情。我将展示如何调整ACL,原则上这种方法可用于授予远程用户访问权限,但我不建议这样做。

答案 1 :(得分:0)

如果您遇到此特殊异常,通常意味着您的服务未运行。我看到您在网址中使用localhost。我只想确保主机和服务在同一台机器上运行。 WCF不允许在具有此绑定的计算机之间进行通信。

当我收到此消息时,通常我会检查并发现我忘记启动该服务,因此,没有端点侦听。请检查您的服务是否实际上仍在运行,并且在抛出异常时没有崩溃。如果这不能解决问题,请发布您的进度,我可以提出更多建议。

答案 2 :(得分:0)

我通过创建IIS端点解决了这个问题,我最终调用了从可用到匿名用户的网络管道,这意味着没有假冒。