WCF的传输安全(读书笔记)

Wcf的传输安全主要涉及认证、消息的一致性和机密性。Wcf采用两种不一样的机制来解决这三个涉及传输安全的问题,即Transport安全模式和Message安全模式。 web

Transport安全模式利用基于传输层协议的安全机制解决传输安全涉及的三个问题。TLS/SSL是实现Transport安全最经常使用的方式。它的优缺点: windows

1. Transport安全模式依赖于具体的传输协议 安全

2. 它只能提供基于点对点的安全传输保障,即客户端直接链接到服务端的场景。若是客户端和服务端之间的网络须要一些用于消息路由的中间节点,Transport安全模式则没有了用武之地。 网络

3. 若是用Transport安全模式,意味着咱们不得不在传输层(而不是在应用层)解决对客户端的认证。这就决定了可供选择的认证方式比较少。app

Message安全模式直接将安全策略的目标对象转移到消息自己,经过对消息进行签名、加密实现消息安全传输。提供消息从发送端到接受端之间的安全传输,即端到端(end-to-end)安全传输。Message下的安全协议是一种应用层的协议。它的优缺点: asp.net

1. 因为Message安全模是在应用层经过对消息实施加密、签名等安全机制实现的,因此这是一种与具体传输协议无关的安全机制,不会因底层采用的是Tcp或http而有所不一样。较之Transport安全,这种基于应用层实现的安全机制在认证方式上具备更多的选择。 dom

2. 因为Message安全模式下的各类安全机制都是直接应用在消息(soap)级别的,所以不管消息路由多么复杂,都可以保证消息的安全传输。不一样于Transport安全模式只提供点到点(point-to-point)的安全,Message安全模式提供端到端(end-to-end)的安全。 ide

3. 因为Message安全模式是对WS-Security,WS-Trust,WS-SC,WS-SP这四个ws-*规范的实现,因此具备很好的互操做性,可以提供跨平台的支持。性能

可是Transport安全模式有一点是Message安全模式不能比的,那就是性能。 ui

 

认证方式:

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();

……

}

}

相关文章
相关标签/搜索