对等通道消息身份验证
此示例演示如何将基于消息的身份验证与 NetPeerTcpBinding 绑定结合使用,该绑定使用对等通道提供多方通信。此示例是入门示例的变体。有关 Windows Communication Foundation (WCF) 的概述,请参阅入门示例。
在此示例中,应用程序实例是自承载的控制台应用程序。
与其他传输绑定示例不同,此示例使用 IQuoteChange
协定接口来演示多方通信。所有实例都实现此协定以接收消息,并创建同一协定的代理以向网格发送消息。这可以通过创建网格的双工通道进行演示。
提示
本主题的末尾介绍了此示例的设置过程和生成说明。
理解示例中的绑定配置过程涉及到以下对等通道概念:
- 对等解析程序**负责将网格 ID 解析为网格中若干节点的终结点地址。
- 网格**是由网格 ID 标识的对等节点的命名集合。
- 对等节点**是参与网格的应用程序的实例。
- 网格 ID 标识网格中终结点地址的主机部分。这些地址的示例有“net.p2p://chatMesh/servicemodelsamples/chat”或“net.p2p://broadcastMesh/servicemodelsamples/announcements”。其中的 chatMesh 和 broadcastMesh 就是网格 ID。
- 参与某个网格的所有客户端都使用相同的网格 ID,但有可能使用不同的路径和服务。寻址到特定终结点地址的消息被发送到使用该地址的所有客户端。
在打开一个对等节点后,它会使用对等解析程序将网格 ID 解析为网格中其他对等节点的地址列表。这样便可以在整个网格中传播消息。
PeerTransportCredentialType 指定网格中的对等端之间如何进行身份验证。可以在绑定配置中、NetPeerTcpBinding 对象中或通过使用 PeerTransportBindingElement 绑定元素来指定此属性。在 Peer 属性上指定了具有适当证书的 ClientCredentialSettings(或 ServiceCredentialSettings)实例必须根据使用情况添加到通道工厂或服务主机上的行为集合中。
对等通道在 PeerTransportCredentialType 类中支持下列身份验证模式:
- Password. 这是对等通道的默认身份验证模式。在这种模式下,网格中的所有参与者都应证明自己知道机密密码。通过在邻居之间建立安全的连接并交换此密码的转换,可以实现这一点。如果指定了 Password,ClientCredentialSettings.Peer 属性必须带有一个有效的密码,另外还可以带有一个 X509Certificate2 实例(使用 SetSelfCertificate)。
- Certificate. 在这种模式下,将在建立对等连接时执行应用程序特定的身份验证。如果指定了此模式,应用程序必须在 ClientCredentialSettings.Peer.PeerAuthentication 中指定一个添加到通道工厂的 X509Certificate2Validator 的具体实现。
当 NetPeerTcpBinding.Security.Mode
属性设置为 SecurityMode.Message
或 SecurityMode.TransportWithMessageCredential
时,应用程序可以对传出消息进行签名并验证传入消息。
对传出消息进行签名时使用通过 ClientCredentialSettings.Peer.SetSelfCertificate()
指定的 X509Certificate2
的实例。
消息签名是使用 X509Certificate2
的实例执行的。若要对传出消息进行签名(在 DuplexChannel
的 OutputChannel
情况下),应用程序必须使用 PeerCredential.SetSelfCertificate()
指定要用来签名的凭据。
若要验证传入消息(InputChannel
或 DuplexChannel
),应用程序必须指定 X509Certificate2Validator
(验证消息来源并使用 ServiceCredentialSettings.Peer.MessageSenderAuthentication()
指定)的具体实现。
绑定在发送方和接收方的配置文件中指定。绑定类型在 endpoint
元素的 binding
属性中指定,如下面的示例所示。
<services>
<service name="Microsoft.ServiceModel.Samples.BroadcastReceiver">
<!-- use base address provided by the host -->
<endpoint address="Stocks"
binding="netPeerTcpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.IQuoteChange" />
</service>
</services>
如果使用具有默认行为的 NetPeerTcpBinding
绑定,则将启用基于密码的安全性。binding
元素提供用来设置端口、侦听 IP 地址、解析程序类型、最大消息大小、最大缓冲池大小、读取器配额、对等节点身份验证模式、消息身份验证和超时(对于关闭、打开、发送和接收)的属性。
提示
此示例使用默认对等解析程序 (PNRP),该程序未在 WCF 中提供。因此,若要在 WCF 中运行此示例,必须使用自定义对等解析程序。有关使用自定义对等解析程序的示例,请参阅对等通道聊天,例如:
<netPeerTcpBinding>
<binding configurationName="Binding1">
<resolver mode="Custom">
<customResolver type=
"MyAppNameSpace.MyCustomPeerResolver, myApp"/>
</resolver>
</binding>
</netPeerTcpBinding>
包含 MyCustomPeerResolver
的文件必须使用发送方和接收方进行编译。请注意,如果该示例正在多台使用不同平台的计算机上运行,则它们都应该使用同一个解析程序。
接收方和发送方实现还演示如何检索与接收方或发送方实例关联的对等节点,以及如何注册其联机和脱机事件。如果对等节点至少连接到网格中的一个其他对等节点,则会启动联机事件。当对等节点不再连接到网格中任何其他对等节点时,会启动脱机事件。
此时,对等通道不会与Service Model Metadata Utility Tool (Svcutil.exe) 集成。因此,无法利用 Svcutil.exe 为发送方生成类型化通道。
运行示例时,发送方将显示一条消息,指示它已准备好发送消息。输入值并按 Enter 会将当前库存值发送给接收方客户端。更新显示在其他客户端控制台窗口中。若要终止客户端,请在发送方的控制台窗口中输入一个空白值(对于接收方客户端,则按 Enter)。
如果启用了跟踪或消息日志记录,则可以监视更深级别上的发送方和接收方活动。下面的过程描述了如何启用跟踪和消息日志记录。
提示
请注意,该示例当前不处理基础结构引发的所有可能的异常,这一点很重要。如果要在商业/生产环境中使用这些示例,请遵循正确的异常处理最佳做法。
设置、生成和运行示例
若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
若要用单一计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。
在 Windows XP SP2 上安装 PNRP(一次性安装):
- 在**“控制面板”中,双击“添加或删除程序”**。
- 在**“添加或删除程序”对话框中单击“添加/删除 Windows 组件”**。
- 在**“Windows 组件向导”中,选中“网络服务”复选框,然后单击“详细信息”**。
- 选中**“对等”复选框,然后单击“确定”**。
- 在**“Windows 组件向导”中,单击“下一步”**。
- 安装完成时,请单击**“完成”**。
- 从命令 shell 提示符下,使用以下命令启动 PNRP 服务:net start pnrpsvc。
只要步骤 3 指的是客户端和服务,这些步骤就适用于发送方和接收方。
如果是首次运行此示例,请运行 Setup.bat 以创建并注册此示例使用的证书。如果跨多台计算机使用此示例,请只在一台计算机上运行 Setup.bat 并将生成的证书导出到正在使用的所有其他计算机上。这是因为 Setup.bat 将创建一个随机证书,因此每次运行 Setup.bat 都将生成并注册一个唯一的证书。
启动接收方(或多个接收方)和发送方。当实例连接后,在发送方应用程序的控制台中输入值,以便将更新发送给接收方。所有接收方都将收到发送方发送的聊天消息。
运行 Cleanup.bat 以移除此示例创建的证书。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.