分类: 嵌入式
2012-06-24 14:44:51
书接上文,是哪一项配置使得WCF对传输的消息进行加密操作了呢?继续修改配置文件,客户端配置文件如代码清单11-18所示,服务端配置文件如代码清单11-19所示。
代码清单11-18 修改客户端的protectionLevel
xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors >
<endpointBehaviors>
<behavior name="ForListen">
<clientVia viaUri="net.tcp://127.0.0.1:64590/HelloService"/>
behavior>
endpointBehaviors>
behaviors>
<bindings>
<netTcpBinding>
<binding name="tcpWindowsSecurity">
<security mode="Transport" >
<transport protectionLevel="None">transport>
security>
binding>
netTcpBinding>
bindings>
<client>
<endpoint name="helloEndPoint" address="net.tcp://127.0.0.1:64567/HelloService"
binding="netTcpBinding" bindingConfiguration="tcpWindowsSecurity"
contract="WcfSecurityExampleServiceLibrary.IHelloService" behaviorConfiguration="ForListen" />
client>
system.serviceModel>
configuration>
代码清单11-19 修改服务端端的protectionLevel
xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfSecurityExampleServiceLibrary.HelloService" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:64567/"/>
baseAddresses>
host>
<endpoint address="net.tcp://127.0.0.1:64567/HelloService" binding="netTcpBinding"
bindingConfiguration="tcpWindowsSecurity" name="helloEndPoint"
contract="WcfSecurityExampleServiceLibrary.IHelloService"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
service>
services>
<bindings>
<netTcpBinding>
<binding name="tcpWindowsSecurity">
<security mode="Transport" >
<transport protectionLevel="None">transport>
security>
binding>
netTcpBinding>
bindings>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata />
behavior>
serviceBehaviors>
behaviors>
system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
startup>
configuration>
通过以上两段代码,Transport安全模式下的protectionLevel设置为None。此时运行结果和TcpTrace的结果如图11-8所示。
图11-8 protectionLevel为None时的监听结果
从图11-8的结果看,
protectionLevel为None时WCF不提供对消息的机密性的保证。
说明:protectionLevel为None时,通信的完整性也得不到保证。
将protectionLevel修改为Sign,看运行结果有何不同,如图11-9所示。
图11-9 protectionLevel为Sign运行结果
从图11-9中的结果来看,protectionLevel为Sign时没有对数据进行加密,结果和protectionLevel为None时没有什么差异。事实上,当protectionLevel为Sign时,虽然不对数据做加密处理,但是会对数据的完整性做校验。实现方式是为消息添加一个加密的校验和,当接收到消息后,会对消息重新计算校验和并和客户端附加的校验和进行比较,如果不同请求会被拒绝。
protectionLevel的第三种选项为EncryptAndSign,也是Transport安全模式下的默认安全级别。在此种安全级别下,WCF既提供完整性校验又提供消息加密。
----------------------------注:本文部分内容改编自《.NET 安全揭秘》