1、BasicHttpBinding
这种绑定适用于与符合 WS-Basic Profile 的 Web 服务(例如基于 ASP.NET Web 服务 (ASMX) 的服务)进行的通信。此绑定使用 HTTP 作为传输协议,并使用文本/XML 作为默认的消息编码。
basicHttpBinding的默认安全模式是None,即没有任何安全设置,消息都以明文传送,对客户端也不进行验证。
但是basicHttpBinding绑定可以实现安全传输,也可以通过传输层和消息层来保证消息的安全性。
basicHttpBinding设置为Transport安全模式,传输层的安全是使用IIS的安全机制,比如基本身份验证、集成windows验证、SSL安全通道等等。
basicHttpBinding设置为Message安全模式,消息层使用WS-Security保证消息的安全性,Message模式只支持客户端Certificate验证。
2、安全模式NONE
basicHttpBinding绑定默认不提供安全性,默认的安全模式是None,不提供任何安全性,WCF提供这种方式只是为了跟WS-Basic Profile 的 Web 服务兼容。WCF的其它绑定默认都是提供安全性的。
这种方式的安全性:
完整性 | 不提供 |
保密性 | 不提供 |
服务端身份身份验证 | 不提供 |
客户端身份验证 | 无,并忽略客户端验证的其他方式设置,固定为None |
myBinding.Security.Mode = BasicHttpSecurityMode.None;

3、安全模式Message-客户端验证Certificate
basicHttpBinding绑定的Message安全模式,客户端Certificate验证。此时将使用服务端证书,通过WS-Security协议保证消息安全。
WS-Security 规范已经定义了通过使用安全性令牌来安全地交换消息的基本机制。WS-Trust 规范以这个模型为基础进行构建,定义了如何发出和交换这些安全性令牌。
WS-Trust原理上类似SSL或TLS的机制,客户端不必有服务端的证书,服务端证书可以通过消息交换交换到客户端。WS-Security 规范则不同,它没有定义安全令牌的交换,所以客户端需要事先把安装服务端证书,并在通讯时指定服务端证书。
这种方式的安全性:
完整性 | 使用服务端证书,通过WS-Security规范建立的安全通道 |
保密性 | 使用服务端证书,通过WS-Security规范建立的安全通道 |
服务端身份身份验证 | 服务端证书提供 |
客户端身份验证 | 客户端证书提供 |
获得和安装证同时客户端验证设置为Certificate,就需要提供客户端证书以验证客户端身份。
所有这里需要在服务端和客户端分别安装证书。
这里用Makecert.exe工具生成证书,使用下面的命令:
makecert -sr localmachine -ss My -n CN=win2008 -sky exchange -pe -r
这是服务端证书,win2008是服务端的机器名。
makecert -sr currentuser -ss My -n CN=TestClient -sky exchange -pe -r
这是客户端证书。
服务器代码:
BasicHttpBinding myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Message;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
//设置服务端证书
myServiceHost.Credentials.ServiceCertificate.SetCertificate("CN=win2008");
//设置不验证客户端证书的有效性
myServiceHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.None;
客户端代码:
BasicHttpBinding myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Message;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
EndpointAddress ea = new EndpointAddress("http://win2008:8056/WCFService/GetIdentity");
GetIdentityClient gc = new GetIdentityClient(myBinding, ea);
//设置客户端证书
gc.ClientCredentials.ClientCertificate.SetCertificate("CN=TestClient",
StoreLocation.CurrentUser, StoreName.My);
//指定服务端证书
gc.ClientCredentials.ServiceCertificate.SetDefaultCertificate("CN=win2008",
StoreLocation.LocalMachine, StoreName.My);
//不验证服务端证书的有效性
gc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.None;
//执行代理类Get方法
string result = gc.Get(WindowsIdentity.GetCurrent().Name);

4、Transport--客户端验证None
BasicHttpBinding绑定默认不提供安全性,如果设置了Transport安全模式,需要通过IIS承载WCF服务,利用HTTPS协议来提供Transport层面的安全性。
这种方式的安全性:
完整性 | 服务端证书通过SSL保证 |
保密性 | 服务端证书通过SSL保证 |
服务端身份身份验证 | 服务端证书通过SSL验证服务端 |
客户端身份验证 | 无 |
5、Transport--客户端验证Basic
这部分测试HttpBinding设置为Transport安全模式,同时客户端验证设置为Basic验证时的情况。
实际上HttpBinding的Transport安全模式,WCF服务端是由IIS承载的,所以它的身份验证使用IIS的身份验证模式。
Basic身份验证,是由客户端提供服务端的windows用户的用户名和密码,用户名以明码方式发送,密码以base64编码方式发送,base64编码可以看作是明码。服务端收到客户端发送的用户名和密码后,跟服务端的windows用户中的用户去比对,如有匹配的则验证客户端的身份。
这种方式的安全性:
完整性 | 服务端证书通过SSL保证 |
保密性 | 服务端证书通过SSL保证 |
服务端身份身份验证 | 服务端证书通过SSL验证服务端 |
客户端身份验证 | 客户端提供服务端windows用户的用户名和密码,服务端验证。客户端传送到服务端的用户名和密码同样被SSL加密。 |
//使用BasicHttpBinding绑定
BasicHttpBinding myBinding = new BasicHttpBinding();
//使用Transport安全模式
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
//客户端验证为None
//myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
//客户端验证为Basic
//myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
//客户端验证为Ntlm
//myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
//客户端为Basic时,客户端提供用户名和密码
//gc.ClientCredentials.UserName.UserName = "chnking";
//gc.ClientCredentials.UserName.Password = "jjz666";
6、Transport--客户端验证NTLM,Windows