2
2、 安全模式Message - 客户端验证:Certificate. 5
3.3. 设置服务端IIS设置( SSL服务端证书)... 9
4、 Transport – 客户端验证:Basic. 16
5、 Transport – 客户端验证:Ntlm... 18
6、 Transport – 客户端验证:Windows. 21
7、 Transport – 客户端验证:Certificate. 21
绑定可指定在与终结点通话时所使用的通信机制,并指示如何连接到终结点。绑定由一些元素组成,这些元素指定如何对 Windows Communication Foundation (WCF) 通道进行分层以提供所需的通信功能,包括采用什么基础传输协议,TCP或Http等,使用什么协议保证消息的安全性,比如HTTPS或者WS-security,传输的消息的编码方式,比如TEXT还是MTOM。
WCF中有多种binding形式,多种安全模式,多种身份验证方式,这些组合在一起可以形成太多的组合。
本文将把各种典型的安全模式、各种绑定和客户端验证方式组合分别用实例进行配置并测试验证。这一篇是专门讨论BasicHttpBinding绑定的。
测试环境
l 服务端:
服务器名:win2008
操作系统:Windows server 2008
开发环境:visual studio 2008
运行环境:.net framework 3.5
Web服务器: IIS 7.0
浏览器:IE 7.0
l 客户端:
服务端机器同时充当测试客户端机器,同时准备了一台win2003的机器做测试客户端:
计算机名:win2003base2
操作系统:Windows server 2003
运行环境:.net framework 3.5
浏览器:IE 7.0
共用测试WCF服务类
所有测试都是用同样的服务端contract和实现这个contract的service:
[ServiceContract(Namespace = "http://chnking.com")]
public interface IGetIdentity
{
[OperationContract]
string Get(string ClientIdentity);
}
public class GetIdentity : IGetIdentity
{
public string Get(string ClientIdentity)
{
return ("服务端Identity 是'" + ServiceSecurityContext.Current. PrimaryIdentity.Name +
"'/n/r客户端Identity是 '" + ClientIdentity + "'");
}
}
代码很简单,一个contract提供了一个Get方法,接收一个string参数,返回一个string参数。在后面的测试中,客户端把客户端安全上下文的Identity发送到服务端,服务端返回服务端安全上下文的Identity给客户端。
一、 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验证。
1、 安全模式None
这部分的测试代码:basicHttpBinding_None.rar
basicHttpBinding绑定默认不提供安全性,默认的安全模式是None,不提供任何安全性,WCF提供这种方式只是为了跟WS-Basic Profile 的 Web 服务兼容。WCF的其它绑定默认都是提供安全性的。
这种方式的安全性:
完整性 | 不提供 |
保密性 | 不提供 |
服务端身份身份验证 | 不提供 |
客户端身份验证 | 无,并忽略客户端验证的其他方式设置,固定为None |
本例采用全代码方式,不使用配置文件。
服务端代码:
internal class MyServiceHost
{
internal static ServiceHost myServiceHost = null;
internal static void Main()
{
//设置BasicHttpBinding绑定
BasicHttpBinding myBinding = new BasicHttpBinding();
//安全模式None
myBinding.Security.Mode = BasicHttpSecurityMode.None;
Uri baseAddress = new Uri("http://localhost:8056/WCFService/");
myServiceHost = new ServiceHost(typeof(GetIdentity), baseAddress);
ServiceEndpoint myServiceEndpoint = myServiceHost.AddServiceEndpoint(typeof(IGetIdentity), myBinding, "GetIdentity");
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;