WCF的传输安全(读书笔记)
Wcf的传输安全主要涉及认证、消息的一致性和机密性。Wcf采用两种不同的机制来解决这三个涉及传输安全的问题,即Transport安全模式和Message安全模式。
Transport安全模式利用基于传输层协议的安全机制解决传输安全涉及的三个问题。TLS/SSL是实现Transport安全最常用的方式。它的优缺点:
1. Transport安全模式依赖于具体的传输协议
2. 它只能提供基于点对点的安全传输保障,即客户端直接连接到服务端的场景。如果客户端和服务端之间的网络需要一些用于消息路由的中间节点,Transport安全模式则没有了用武之地。
3. 如果用Transport安全模式,意味着我们不得不在传输层(而不是在应用层)解决对客户端的认证。这就决定了可供选择的认证方式比较少。
Message安全模式直接将安全策略的目标对象转移到消息本身,通过对消息进行签名、加密实现消息安全传输。提供消息从发送端到接受端之间的安全传输,即端到端(end-to-end)安全传输。Message下的安全协议是一种应用层的协议。它的优缺点:
1. 由于Message安全模是在应用层通过对消息实施加密、签名等安全机制实现的,所以这是一种与具体传输协议无关的安全机制,不会因底层采用的是Tcp或http而有所不同。较之Transport安全,这种基于应用层实现的安全机制在认证方式上具有更多的选择。
2. 由于Message安全模式下的各种安全机制都是直接应用在消息(soap)级别的,因此无论消息路由多么复杂,都能够保证消息的安全传输。不同于Transport安全模式只提供点到点(point-to-point)的安全,Message安全模式提供端到端(end-to-end)的安全。
3. 由于Message安全模式是对WS-Security,WS-Trust,WS-SC,WS-SP这四个ws-*规范的实现,所以具有很好的互操作性,能够提供跨平台的支持。
但是Transport安全模式有一点是Message安全模式不能比的,那就是性能。
认证方式:
1. 用户名和密码认证
a) 将用户名映射为Windows账号,采用windows认证
b) 采用asp.net的成员资格(Membership)模块
c) 自定义认证逻辑
2. NTLM
3. Kerberos
4. 数字证书
(一) 服务端认证
服务端配置
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name=”transportTcpBinding”>
<security mode=”Transport”>
<transport clientCredentialType=”None”/>
</security>
</binding>
</netTcpBinding>
</bindings>
<services>
……
</services>
</system.serviceModel>
客户端配置
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name=”transportTcpBinding”>
<security mode=”Transport”>
<transport clientCredentialType=”None”/>
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
……
</ client >
</system.serviceModel>
具体还需要一些证书之类的配置。
(二) 客户端认证
1. Windows认证
Using(ChannelFactory<Icalculator> channelFactory= new ChannelFactory<Icalculator>(“calculatorService”))
{
NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential.
credential.Domain=”domainName”;
credential.UserName=”username”;
credential.Password=”password”
Icalculator calculator = channelFactory.CreateChannel();
Double resutlt = calculator.Add(1,2);
……
}
2. 用户名密码认证
a) Windows:将用户名和密码映射为Windows账号和密码,采用Windows认证
b) MembershipProvider:利用配置的asp.net MembershipProvider,验证用户名和密码
c) 自定义:通过机箱抽象类UsernamePasswordValidator,自定义用户名/密码验证器进行验证
Using(ChannelFactory<Icalculator> channelFactory= new ChannelFactory<Icalculator>(“calculatorService”))
{
UserNamePasswordClientCredential credential = channelFactory.Credentials.UserName;
credential.UserName=”username”;
credential.Password=”password”
Icalculator calculator = channelFactory.CreateChannel();
Double resutlt = calculator.Add(1,2);
……
}
自定义认证:
Public class SimpelUsernamePasswordValidator: UsernamePasswordValiator
{
Public override void Validate(string username, string password)
{
……
}
}
服务端配置:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=”customAuthenentication”>
<userNameAuthentication userNamePasswordValiationMode=”Custom” customUserNamePasswordValidationType=”……”>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
…….
</bindings>
<services>
……
</services>
</system.serviceModel>
</configuration>
如果是Membership验证模式
<userNameAuthentication userNamePasswordValiationMode=”MembershipProvider” membershipProviderName=”myProvider”>
<system.web>
<membership defaultProvider=”myProvider”>
<providers>
<add name=”myProvider”
Type=”……”
ConnectionStringName=”…”
applicationName=””
requiresQuestionAndAnswer=”false”
/>
</providers>
</membership>
</system.web>
3. 证书认证
客户端
Using(ChannelFactory<Icalculator> channelFactory= new ChannelFactory<Icalculator>(“calculatorService”))
{
channelFactory.Credentials.ClientCertifacte.SetCentificate(
StoreLocation.LocalMachine,
StoreName.TrustedPeople,
X509FindType.FindBySubjectName,
“foo”);
Icalculator calculator = channelFactory.CreateChannel();
Double resutlt = calculator.Add(1,2);
……
}
服务端:
Using(ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
ServiceCredentials serviceCredentials = host.Description.Behaviors.Find<ServiceCredentials>();
If(null = serviceCredentials)
{
serviceCredentials = new serviceCredentials();
serviceCredentials.ClientCertifacte.Authentication.CretifacteValidationMode = X509CetrtifacteValidationMode.PeerOrChainTrust.
host.Description.Behaviors.Add(serviceCredentials);
host.Open();
……
}
}
WCF的传输安全(读书笔记)的更多相关文章
- PCI-Express协议传输层读书笔记
http://www.doczj.com/doc/35cb19633169a4517723a3d9-9.html
- WPF,Silverlight与XAML读书笔记第四十八 - Silverlight网络与通讯
说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 这一部分我们重点讨论下Silverlight ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Spark存储管理(读书笔记)
Spark存储管理(读书笔记) 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark的存储管理 RDD的存放和管理都是由Spark的存储管理模块实现和管理的.本文从 ...
- 《C#图解教程》读书笔记之一:C#和.NET框架
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.在.NET之前的编程世界 C#语言是在微软公司的.NET框架上开发程序而设计的,首先作者给大家纠正了一下C# ...
- 《TCP/IP详解卷1:协议》第1章 概述-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 『TCP/IP详解——卷一:协议』读书笔记——02
2013-08-16 20:07:11 1.3 TCP/IP的分层 这是一个很好的图,要多看!!图上有些细节会在今后的笔记中提到,看不懂不必深究. IP是网络层上的主要协议,同时被TCP和UDP(这两 ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
随机推荐
- 微软发布Windows 10:连Windows 7都能免费升级了
今日凌晨,微软宣布Windows 10发布. Windows10 整体重置了 Window8 的设计,恢复了原有的开始菜单设置,系统新增了虚拟桌面功能,搜索框加分类项的形式替代原有的两栏式控制面板界面 ...
- ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云
向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...
- 点击div外面该div消失
<head> <meta charset="UTF-8"> <title></title> <script type=&quo ...
- paip.函数式编程方法概述以及总结
paip.函数式编程方法概述以及总结 1 函数式编程:函数式风格..很多命令式语言里支持函数式编程风格 1.1 起源 (图灵机,Lisp机器, 神经网络计算机) 1.2 函 ...
- css3多列显示
columen-width:定义单列显示的宽度.初始值是auto,适用于不可替代的块级元素,行内块元素和单元格,表格元素除外. 目前Webkit引擎支持-webkit-column-width,Moz ...
- Android JNI HelloWorld实现
创建一个JNIDemo的Android工程 在项目下创建一个文件夹jni.(注意必须是jni目录) 在jni目录下创建两个文件:Android.mk 和 first_jni.c(.c文件的名字可以任意 ...
- ClamAV安装使用及API例子
ClamAV是一款由Sourcefire组织开发的开源杀毒引擎,Sourcefire同时也是Snort入侵检测引擎的所有者.ClamAV提供了一种更为快速灵活的框架用以检测恶意代码和软件产品.可以作为 ...
- Form 表单中的Input元素回车时不保存表单
在Form表单中如果直接在Input元素里敲回车键,那么默认将提交表单,可以通过keydown事件取消默认此操作 $("form").live('keydown',function ...
- GitHub 优秀的 Android 开源项目(转)
今天查找资源时看到的一篇文章,总结了很多实用资源,十分感谢原作者分享. 转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介 ...
- 记一次苦逼的SQL查询优化
最近在维护公司项目时,需要加载某页面,总共加载也就4000多条数据,竟然需要35秒钟,要是数据增长到40000条,我估计好几分钟都搞不定.卧槽,要我是用户的话估计受不了,趁闲着没事,就想把它优化一下, ...