【问题标题】:Using WCF's net.pipe in a website with impersonate=true在 impersonate=true 的网站中使用 WCF 的 net.pipe
【发布时间】:2011-03-22 23:19:45
【问题描述】:

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

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

和 InnerException:

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

还有另一个内部异常给出access denied 消息。

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

有人有什么想法吗?

谢谢 马特

【问题讨论】:

    标签: wcf wcf-binding named-pipes netnamedpipebinding


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我通过使我最终调用网络管道的 IIS 端点对匿名用户可用,从而解决了这个问题,这意味着没有模拟。

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

        • 那么,使用模拟的基于 ASP.NET 的客户端不能调用 Win32 服务上的方法是否公平?
        猜你喜欢
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多