对等通道自定义身份验证

此示例演示如何以自定义身份验证模式使用 NetPeerTcpBinding 绑定,该绑定使用应用程序提供的对等身份验证提供多方通信。此示例是入门示例的变体。有关 Windows Communication Foundation (WCF) 的概述,请参阅入门示例

在此示例中,所有实例都是自承载的控制台应用程序,没有客户端和服务器的概念。

与其他的传输绑定示例不同,此示例为演示多方通信而使用 IChat 协定接口。所有实例都实现此协定以接收消息,并创建同一协定的代理以向网格发送消息。这可以通过创建网格的双工通道进行演示。

提示

本主题的末尾介绍了此示例的设置过程和生成说明。

对等通道是 WCF 中的一种多方对等 (P2P) 通信技术。它为应用程序开发人员提供了基于消息的、安全且可伸缩的 P2P 信道。可从对等通道中获益的多方应用程序的一个常见示例是协作应用程序,例如在以对等方式(无需服务器)相互聊天的一组人中进行聊天。对等通道支持有关 P2P 协作、内容分发、负载平衡和分布式处理的使用者和企业方案。

对等通道引入了下列新概念:

  • “网格”**是彼此之间可以相互通信并由唯一的网格 ID 标识的对等节点的命名集合(一个互连图)。

    提示

    网格中的活动节点发布其网格名称,以便其他节点可以找到它们。网格具有下列特征:当节点加入和离开网格时,网格会自动进行调整,以确保所有节点都与网格具有良好的连接性,并根据当前流量模式动态优化这些连接。

  • “对等节点”**是网格中的终结点。一个应用程序可以具有加入不同网格的多个对等节点。

  • 对等解析程序**负责将网格 ID 解析为网格中若干节点的终结点地址。对等节点使用这些地址连接到网格中的其他节点。这样便可以在整个网格中传播消息。

PeerTransportCredentialType 指定网格中的对等端之间如何进行身份验证。可以在绑定配置中、NetPeerTcpBinding 对象中或使用 PeerTransportBindingElement 指定此属性。在 Peer 属性上指定了具有适当证书的 ClientCredentialSettings(或 ServiceCredentialSettings)实例必须根据使用情况添加到通道工厂或服务主机上的行为集合中。

对等通道在 PeerTransportCredentialType 类中支持下列身份验证模式:

  1. Password。这是对等通道的默认身份验证模式。在这种模式下,网格中的所有参与者都应证明自己知道机密密码。通过在邻居之间建立安全的连接并交换此密码的转换,可以实现这一点。如果指定了 PasswordClientCredentialSettings.Peer 属性必须带有一个有效的密码,另外还可以带有一个 X509Certificate2 实例(使用 SetSelfCertificate)。
  2. Certificate。 在这种模式下,将在建立对等连接时执行应用程序特定的身份验证。如果指定了此模式,应用程序必须在 ClientCredentialSettings.Peer.PeerAuthentication 中指定一个添加到通道工厂的 X509Certificate2Validator 的具体实现。

绑定是在客户端的配置文件中指定的。绑定类型在终结点元素的 binding 属性中指定,如下面的示例所示。

<client>
  <!-- chat instance participating in the mesh -->
  <endpoint name="ChatEndpoint"
            address="net.p2p://SecurechatMesh/servicemodelsamples/chat"
            binding="netPeerTcpBinding"
            bindingConfiguration="MyBinding"
            contract="Microsoft.ServiceModel.Samples.IChat">
  </endpoint>
</client>

如果您以默认行为的方式使用 NetPeerTcpBinding 绑定,则将启用基于密码的安全性。binding 元素提供设置端口、侦听 IP 地址、解析程序类型、最大消息大小、最大缓冲池大小、读取器配额、身份验证模式、消息身份验证和超时(关闭、打开、发送和接收)的属性。

提示

此示例使用默认对等解析程序 (PNRP),该程序未在 Windows Server 2003 中提供。因此,若要在 Windows Server 2003 上运行此示例,必须使用自定义对等解析程序。请参阅对等通道聊天以查找使用自定义对等解析程序的示例,例如:

<netPeerTcpBinding>
    <binding configurationName="Binding1"> 
        <resolver mode="Custom">
            <customResolver type=
                 "MyAppNameSpace.MyCustomPeerResolver, myApp"/>
        </resolver>
    </binding>
</netPeerTcpBinding>

必须使用聊天实例来编译包含 MyCustomPeerResolver 的文件。请注意,如果该示例正在多台使用不同平台的计算机上运行,则它们都应该使用同一个解析程序。

此示例还演示如何检索与接收方或发送方实例相关联的对等节点,以及如何注册其联机和脱机事件。如果对等节点至少连接到网格中的一个其他对等节点,则会激发联机事件**。如果对等节点不再连接到网格中的任何其他对等节点,则会激发脱机事件**。

此时,对等通道不会与 ServiceModel Metadata Utility Tool (Svcutil.exe) 集成。

运行此示例时,客户端显示一条消息,指示它已准备好发送消息。由一个客户端发送的消息会在加入到同一网格的所有其他客户端的控制台窗口上显示。若要终止客户端,请在客户端的控制台窗口中先按**“Q”**键,再按 Enter。

如果启用了跟踪或消息日志记录,则可以监视更深级别上的消息活动。下面的过程描述了如何启用跟踪和消息日志记录。

提示

请注意,该示例当前不处理基础结构引发的所有可能的异常,这一点很重要。如果要在商业/生产环境中使用这些示例,请遵循正确的异常处理最佳做法。

设置、生成和运行示例

  1. 请确保已经执行了 Windows Communication Foundation 示例的一次性安装过程

  2. 若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要用单一计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。

  4. 在 Windows XP SP2 上安装 PNRP(一次性安装):

    1. 在**“控制面板”中,双击“添加或删除程序”**。
    2. 在**“添加或删除程序”对话框中单击“添加/删除 Windows 组件”**。
    3. 在**“Windows 组件向导”**中,选中“网络服务”复选框,然后单击“详细信息”。
    4. 选中“对等”复选框,然后单击“确定”。
    5. 在**“Windows 组件向导”**中,单击“下一步”。
    6. 安装完成时,请单击“完成”。
    7. 从命令 shell 提示符下,使用以下命令启动 PNRP 服务:net start pnrpsvc
  5. 只要步骤 3 引用客户端和服务,这些步骤就应用于应用程序的单个实例。

  6. 如果首次在计算机上运行此示例,则运行 Setup.bat 以创建一个可授予权限的证书和两个客户端证书。颁发机构的默认名称是“TrustedPeerChannelIssuer”,客户端证书的默认名称是“peer1”和“peer2”。可以通过将参数传递到 Setup.bat 来指定名称,如下所示:“setup.bat <对等名称> <颁发者名称>”,其中 <对等名称> 客户端的前缀名,<颁发者名称> 是示例的可信颁发者的名称。例如,输入“setup.bat peer fake_issuer”创建名为“fake_issuer”的可信颁发者以及名为“peer1”和“peer2”的客户端证书。如果要在单一计算机上运行示例的所有实例,请继续执行步骤 7。

  7. **多个计算机安装的其他步骤:**若要在不同的计算机上运行该示例,必须将证书信息从单一计算机复制到运行该示例的所有其他计算机,以使所有对等方的颁发者信息都是一致的。这可以通过导出使用可信颁发者(由 Setup.bat 生成)创建的客户端证书来实现。还必须将可信颁发者(使用默认名称时为 TrustedPeerChannelIssuer.cer)复制到运行该示例的所有其他客户端计算机。请按照下列三个步骤执行操作:

    1. 传送可信颁发者:将 .cer 文件(通过在同一文件夹中运行 Setup.bat 生成)复制到客户端计算机。右击该文件并选择**“安装证书”。按“下一步”,然后选择“将所有的证书放入下列存储”。按“浏览”,然后选择“受信任人”作为证书的目标。选择“下一步”“完成”**以完成导入证书。

    2. 导出客户端证书:首先在用于生成客户端证书的计算机上运行 Certmgr.msc。从个人存储中选择客户端证书(在“证书 - 当前用户”->“个人”->“证书”下)。右击证书,然后选择“所有任务”->“导出…”以启动“证书导出向导”。按“下一步”,选择“是,导出私钥”,然后按“下一步”。再次选择“下一步”以选择 .pfx 格式和默认值。为证书输入一个密码,然后再次单击“下一步”。最后,选择一个路径和文件名,再单击“下一步”和“完成”以完成导出过程。

    3. 导入客户端证书:将通过步骤 (b) 创建的 .pfx 文件复制到客户端计算机。右击该文件并选择“安装 PFX”。按两次“下一步”,然后输入导出证书所用的密码。按“下一步”和“完成”将证书放入个人存储中。

      提示

      如果未正确分发文件,则创建一个可信颁发者并使用文件传输将其导出可能会导致某些安全风险。请在运行示例后务必清理示例证书(步骤 8)。

  8. 根据需要运行尽可能多的应用程序实例。由一个实例发送的消息可由其他实例接收。每个实例均有一个默认名称“peer1”。若要区分特定实例,请更改应用程序配置文件中 appSettings 的“member”密钥值,并使用相同名称创建客户端证书。

  9. 最后,运行 Cleanup.bat 以移除此示例创建的证书。如果使用了非默认名称,请使用步骤 6 中所用的相同值运行“Cleanup.bat <对等名称> <颁发者名称>”。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.