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

cit*_*att 4 wcf named-pipes netnamedpipebinding wcf-binding

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

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

和InnerException:

The pipe name could not be obtained for net.pipe://localhost/mypipename.
Run Code Online (Sandbox Code Playgroud)

并且有另一个内部异常给出access denied消息.

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

有没有人有任何想法?

谢谢马特

Chr*_*son 7

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

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

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

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

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