转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/13/2683514.html

这一篇我们利用上一篇制作的证书,来演示一个基于SSL的WCF服务,客户端需要验证服务器端的身份,服务器端不对客户端进行任何验证,即匿名客户端。

一、项目结构

为了演示方便,把项目分成了6层,首先说明一下项目的结构:

程序集名称 引用 简单说明
Client1   控制台客户端1,调用采用控制台自宿主的WCF
Client2   控制台客户端2,调用采用IIS宿主的WCF
Host_Server

System.ServiceModel
LxContracts(项目中)
LxServices (项目中)

控制台服务端采用控制台宿主WCF
HostWeb_Server

System.ServiceModel
LxContracts(项目中)
LxServices (项目中)

空的ASP.NET 网站,只包含一个BookSrv.svc文件
LxContracts

System.ServiceModel
System.Runtime.Serialization

WCF 的数据契约和操作契约
LxServices LxContracts(项目中) WCF 服务实现

二、代码说明:

1、类库LxContracts(包括数据契约Books.cs和操作契约IBookContract.cs 文件) 

Books.cs 代码
IBookContract.cs 代码

2、类库LxServices(包括服务类BookService.cs 文件)

BookService.cs 代码

3、Host_Server (控制台宿主)

我们的服务代码已经写好了,现在我们对该服务进行一下宿主,首先采用控制台宿主,为解决方案添加一个Host_Server 的控制台程序,我们服务的绑定方式采用wsHttpBinding 方式。并修改其App.config 文件,代码如下:

宿主程序 App.config 代码

和原来未基于SSL的WCF服务配置http 变为了https,至于基地址为什么写 计算机名这个原因,我们下面会进行解释。

宿主程序 Main函数代码

我们生成一下Host_Server,右击该项目选择 “启动新实例”,控制台宿主程序可以进行启动,如下图所示:

4、Client1:(控制台客户端1 对 控制台宿主的WCF 进行调用)

我们来调用一下新建控制台应用程序Client1,并添加服务引用,输入: https://lx-pc:9000/mex 之后,点击 “发现” 按钮(此时保证服务器端已经启动),会找我们发布的服务,命名为:WCF.BookSrv, 选择“高级“,集合类型选择: System.Collections.Generic;点击"确定",成功添加该服务引用。

这里需要解答一下上一篇做证书的时候为什么要将我们的证书 导入到 受信任人 或者 受信任的根证书颁发机构中,如果不这样做的话,我们的证书就是不可信任的,在客户端添加引用的时候,会有这样一个提示 “颁发此安全证书的公司不是您信任的公司”

由于我们在制作证书的时候,进行了此步骤的操作,所以不会产生该问题。

我们编写一下Client1客户端代码:

Client1 Main 函数代码

客户端 Client1 添加引用后,自动产生的App.config 代码:

Client1 App.config 代码

好了,我们在启动 服务器端的情况下,运行一下 我们的Client1 客户端,我们会发现服务调用成功了,没有任何的问题:

5、利用IIS宿主发布该服务:

我们在项目中添加一个 命名为 “HostWeb_Server” 的Asp.net 空网站,引用项目中的“LxContracts程序集”和“LxServices 程序集”,并添加一个“BookSrv.svc” 文件,删除“BookSrv.Svc.cs” 文件,右击“BookSrv.svc”文件,选择“查看标记”,将里面的内容修改为:

<%@ ServiceHost Language="C#" Service="LxServices.BookService" %>

并修改网站的webconfig 文件 为如下代码,之后,生成我们的网站。

Web.Config 文件代码

接下来,打开IIS,新建网站,命名为 LxWCFSSL,程序池选择“ASP.NET v4.0”,物理路径选择我们解决方案中 HostWeb_Server 的目录,绑定类型选择 https,端口默认 433,证书选择 Lx-PC,如下图:

点击“确定” 按钮之后,点击我们新建的网站,在SSL 设置中,选择“要求SSL”,客户端证书选择 忽略,

这时候,我们就在IIS中部署好了我们的这个基于SSL的WCF站点。细心的人这时候可以发现,如果再次运行netsh 命令,结果如下:

是不是发现我们建立的证书又跟443端口进行了绑定了呢。

6、Client2 (控制台客户端2 对 IIS宿主的WCF 进行调用)

我们在解决方案中添加 控制台程序Client2 对刚刚在IIS中部署的WCF进行调用。添加服务引用,我们输入:https://127.0.0.1/BookSrv.svc,会弹出一个警告对话框;

我们先不去理他,点击是,并完成添加服务引用。

我们仍然用Client1 中的客户端代码进行 服务的调用,这时候会发生一个异常,如图:

这是为什么呢?这就是上一篇中 建立证书的时候,为什么要默认计算机名称的问题。我们把证书加入到 可信任的颁发机构的时候 颁发者 是Lx-PC,因为127.0.0.1 和 Lx-PC 不匹配,所以无法建立信任关系,因此会产生该异常。那意思是不是就得写计算机名称,而不能写 ip 了呢,其实我们这个是一个Win7 下的Demo,如果在局域网证书服务器发布的证书或者购买的第三方机构的证书,应该是不会有此问题的,一般来讲,证书 的CN 应该是我们的 网站的域名 比如:http://wwww.xxx.com,两者保持一致就不会产生这个问题了,这块没有实验,只是个人的理解。

那怎么解决这个问题呢?有两种方法:

1) 引用服务的时候 更改为:https://Lx-Pc/BookSrv.svc,然后添加引用,运行我们的客户端,就会成功。

2) 这是网上找到的一个方法,就是 在验证服务器证书回调事件增加一方法,让它始终返回True,始终信任该证书。

我们在Client2 中增加一个ServerTrust的类,代码如下:

ServerTrust.cs 代码

修改一下Client2 代码:

Cilent2 Main 函数代码

Client2 编译后运行也会成功调用我们部署的服务。

个人认为第二种方法不可取,如果这样的话,客户端对服务器端的认证就失去了意义,这仅仅是解决该DEMO 的一个方式。

至此,我们的这个Demo 结束,我们也应该对证书的配置和基于SSL的WCF服务有所了解了,下一篇将在此代码基础上对客户端进行验证。

重温WCF之WCF传输安全(十三)(2)基于SSL的WCF匿名客户端(转)的更多相关文章

  1. 基于SSL的WCF传输安全

    [实践]WCF传输安全1:前期准备之证书制作   [实践]WCF传输安全2:基于SSL的WCF匿名客户端   [实践]WCF传输安全3:基于SSL的WCF对客户端验证   [实践]WCF传输安全4:基 ...

  2. 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...

  3. 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...

  4. WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发

    今天继续WCF分布式开发步步为赢系列的第4节:WCF服务可靠性传输配置与编程开发.这个章节,我们要介绍什么是WCF服务的可靠性传输,随便介绍网络协议的概念,Web Service为什么不支持可靠性传出 ...

  5. WCF 笔记 (2) - 传输泛型 List 对象

    WCF 笔记 (2) - 传输泛型 List 对象 本帖介绍怎么在 WCF 中,在 Server-side 和 Client-side 之间,传递默认无法传输的 List<T>.List& ...

  6. C# WCF学习笔记(二)终结点地址与WCF寻址(Endpoint Address and WCF Addressing) WCF中的传输协议

    URI的全称是 Uniform Rosource Identifire(统一资源标识),它唯一标识一个确定的网绐资源,同时也表示资源所处的位置及访问的方式(资源访问所用的网络协议). 对于Endpoi ...

  7. 使用Fiddler解析WCF RIA Service传输的数据

    原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...

  8. WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]

    原文:WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇] 在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来 ...

  9. 一步步改造wcf,数据加密传输-匿名客户端加密传输

    一步步改造wcf,数据加密传输-匿名客户端加密传输 百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传 ...

随机推荐

  1. Android自定义标题栏

    预览一下效果: 素材: 新建一个布局title_bar.xml,代码如下: <?xml version="1.0" encoding="utf-8"?&g ...

  2. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  3. Codeforces Gym 101138 G. LCM-er

    Description 在 \([a,b]\) 之间选择 \(n\) 个数 (可以重复) ,使这 \(n\) 个数的最小公倍数能被 \(x\) 整除,对 \(10^9+7\) 取膜. \(1\leqs ...

  4. The Adapter of ListView: Just adapt data to view, don’t do anything else

    The design of SimpleAdapter is not good in my opinion. An adapter should just adapter the data to vi ...

  5. Python 正则表达式:只要整数和小数

    要求用户只能输入数字(包括整数和小数),如何用正则表达式验证用户输入? 有两种思路: 1. 给出正确格式的正则表达式,然后看输入是否合法. 2. 列出所有错误的输入,看输入是否非法. 对于思路1,想想 ...

  6. IPC----哲学家就餐问题(并发与互斥)

    哲学家就餐问题描述: 5个哲学家,5个筷子.5个哲学家围坐在一张桌子上,筷子放在分别放在每个哲学家的两旁.如果所有哲学家在某个时刻同时拿起左边的筷子,那么右边的筷子就都被其他的哲学家拿了,造成大家都无 ...

  7. [转载]能不能同时用static和const修饰类的成员函数?

    题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量).请问:能不能同时用static和con ...

  8. subprocess模块在Windows下调用失败问题

    bug of pythonhttp://bugs.python.org/issue1759845 解决:print sys.stdout.encoding  #eg : it shows cp936i ...

  9. mongoengine

    http://docs.mongodb.org/ecosystem/drivers/python/ http://www.cnblogs.com/holbrook/archive/2012/03/11 ...

  10. NGUI图片闪光

    先上效果 Shader Shader "Unlit/Transparent Colored Flow Texture" { Properties { _MainTex (" ...