服务经常发布元数据,以启用客户端代理类型的自动生成和配置。 当服务不受信任时,客户端应用程序应验证元数据是否符合客户端应用程序的安全、事务、服务协定类型等策略。 以下示例演示如何编写客户端终结点行为,该行为验证服务终结点以确保服务终结点安全使用。
该服务公开四个服务终结点。 第一终结点使用 WSDualHttpBinding,第二终结点使用 NTLM 身份验证,第三终结点启用事务流,第四终结点使用基于证书的身份验证。
客户端使用 MetadataResolver 类检索服务的元数据。 客户端强制实施禁用双工绑定、NTLM 身份验证和使用验证行为的事务流的策略。 对于从服务的元数据导入的每个ServiceEndpoint实例,客户端应用程序在尝试使用 Windows Communication Foundation(WCF)客户端连接到终结点之前,会将一个InternetClientValidatorBehavior
终结点行为实例添加到ServiceEndpoint。 行为 Validate
的方法在调用服务的任何操作之前运行,并通过引发 InvalidOperationExceptions
来执行客户端的策略。
生成示例
- 要生成解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
在同一计算机上运行示例
使用管理员权限打开 Visual Studio 开发人员命令提示符,并从示例安装文件夹运行 Setup.bat。 这会安装运行示例所需的所有证书。
从 \service\bin\Debug 运行服务应用程序。
从 \client\bin\Debug 运行客户端应用程序。 客户端活动显示在客户端控制台应用程序中。
完成示例后,通过运行 Cleanup.bat 来删除证书。 其他安全示例使用相同的证书。
跨计算机运行示例
在服务器上,在 Visual Studio 开发人员命令提示符下,使用管理员权限运行,键入
setup.bat service
。 使用setup.bat
参数运行service
,则使用计算机的完全限定域名创建一个服务证书,并将此服务证书导出到名为 Service.cer 的文件中。在服务器上,编辑 App.config 以反映新的证书名称。 也就是说,将
findValue
属性在 <serviceCertificate> 元素中更改为计算机的完全限定域名。将Service.cer文件从服务目录复制到客户端计算机上的客户端目录。
在客户端上,使用管理员权限打开 Visual Studio 开发人员命令提示符,然后键入
setup.bat client
。 使用setup.bat
参数运行client
将创建名为 Client.com 的客户端证书,并将客户端证书导出到名为Client.cer的文件。在 client.cs 文件中更改 MEX 终结点的地址值和用于设置默认服务器证书的
findValue
以与服务的新地址相匹配。 通过使用服务器的完全限定域名替换 localhost 来执行此操作。 Rebuild。将Client.cer文件从客户端目录复制到服务器上的服务目录。
在客户端上,使用管理员权限打开的 Visual Studio 开发人员命令提示符中运行 ImportServiceCert.bat。 这会将服务证书从 Service.cer 文件导入 CurrentUser - TrustedPeople 存储中。
在服务器上,使用管理员权限打开的 Visual Studio 开发人员命令提示符中运行 ImportClientCert.bat。 这会将客户端证书从 Client.cer 文件导入 LocalMachine - TrustedPeople 存储。
在服务计算机上,在 Visual Studio 中生成服务项目并运行 service.exe。
在客户端计算机上,运行 client.exe。
运行示例后进行清理
运行完示例后,在示例文件夹中运行 Cleanup.bat。
注释
在跨计算机运行此示例时,此脚本不会删除客户端上的服务证书。 如果已运行跨计算机使用证书的 WCF 示例,请确保清除已在 CurrentUser - TrustedPeople 存储中安装的服务证书。 为此,请使用以下命令:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com