WCF读书笔记--安全:基础知识(身份验证、授权、传输安全)

       学WCF也有一段时间了,我买的是<WCF编程>第二版,这本书还是不错的,知识点很全面,不过就是具体的实例很少,这样对于很多的知识点难免会产生"当时看的时候是理解了,但是过一段时间就会忘记"的现象,而且很多的知识会混淆.写这个系列主要是为了复习一下以前学过的知识,把知识做一个系统的整理,便于记忆,再就是对书中的一些内容写出具体的实例,这样记忆会更深刻,我是初学者,肯定会有理解不对的地方,欢迎各位指正.本文中部分内容引用别人的文章,我会在引用的地方标注出来

 

身份验证:一个特定的动作,在该动作中将检验服务的调用者是否符合自己所声称的身份.身份验证是一个相互的过程,服务端验证客户端,反过来,在某些情况下(通过互联网访问),客户端也需要验证服务端.

身份验证包括:

                 1. 无身份验证:         所有的调用者都能访问服务

                 2.Windows身份验证:Kerberos(有域服务器)和NTLM(工作组)

                 3.用户名与密码:       客户端向服务端发送一个用户名和密码,服务端通过一些凭证库来验证

                 4.X509证书:           客户端包含一个证书,服务端预先知道这些证书,当客户端发送请求时,服务端会验证客户端的证书

                 5.定制机制:            允许开发者任意使用一种身份验证机制

                 6.发布口令:             调用者与服务同事依赖一个安全口令

 

授权:允许服务调用者能够执行的内容,这个操作是建立在身份验证基础之上的,如果没有身份验证,那么授权也就无从谈起了.服务端会依赖某个凭证库,在那里调用者会被映射为逻辑角色

WCF凭证库:1.Windows组   2.asp.net Provider  3.自定义角色库(最简单)

 

传输安全:个人理解就是如果保证信息在传输过程中的安全.传输安全是身份验证和授权的前提.

传输安全模式   如图(其实这个图不是从老徐博客里弄得,不过后来才看到右下角有老徐的名字__囧)

传输安全

 

6VK}`7E6~XSR0C1[[M6S0$2

书上讲的为5种模式,但是在VS中的配置文件里,却只有四种,不知道为什么???!~~~

TransportWithMessageCredential  对应的是Mixed

 

None: 关闭了传输安全的功能

Transport Security: 对通道上所有的通信加密,除了接收者外,没有任何一方可以看见消息的内容,这种安全模式只能保证点对点的传输安全,也就是客户端必须与服务端直接连接,

                               这种模式是最简单的,也是性能最好的.通常只用于局域网应用程序

     个人理解:在此模式下,对通道上的所有通信加密,也就是对通信的内容也加密,对内容加密的话,这有点像MessageSecurity模式了,但是Transport的这种内容的加密只能维持在点对点的环境下面,例如有三个点A、B、C,A和B启用了Transport模式

image 

因为Transport要求客户端与服务端就加密进行协商的,在超出点对点的外围以后,消息就不在受保护了,所以在一个复杂的网络环境中,Transport是不可取

 

Message Security: 只是对消息的本身进行加密而不是对传输进行加密,所以能实现端对端的安全传输

                             点对点与端对端还是比较容易区分的,如上图,A与C之间是端到端的关系,A与B之间是点到点的关系

Mixed: 在实现完整性和机密性以及服务端身份验证时采用的是Transport Security模式,而在保护客户端安全凭证的安全时采用了Message Security模式,此模式也是一个点对点的模式

            个人理解:其实就是在是对传输加密的,但是客户端的凭证(用户名,密码)这些信息是被加密的.

Both: 同是使用Transport模式和Message模式,就是传输时安全的,传输的消息也是经过加密的

 

以上为5中传输模式,不过对于Transport,我一直有一个疑问就是:Transport为传输的内容加密吗?

通过请教群里的朋友,他们告诉我是对内容加密的,不过还是在这里提出来,希望有更形象的回答.谢谢啦~~~

 

传输安全模式是在绑定中配置的

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>

编程方式实现:

NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
或者
NetTcpBinding binding1 = new NetTcpBinding();
binding1.Security.Mode = SecurityMode.Transport;
 

传输安全模式与各种binding是一个组合的关系,并不是每种binding都能应用所有的传输安全模式

所有WCF的绑定默认都是安全的,只有BasicHttpBinding默认是非安全的

名称

None

Transport

Message

Mixed

Both

BasicHttpBinding

Yes(默认)

Yes

Yes

Yes

No

NetTcpBinding

Yes

Yes(默认)

Yes

Yes

No

NetNamedPipeBinding

Yes

Yes(默认)

No

No

No

WSHttpBinding

Yes

Yes

Yes(默认)

Yes

No

WSDualHttpBinding

Yes

No

Yes(默认)

No

No

NetMsmqBinding

Yes

Yes(默认)

Yes

No

Yes

Mixed和Both不太常用,可以不用记

1.局域网的绑定都默认使用Transport模式

2.所有互联网的绑定(除BasicHttpBinding外,默认为None)都默认使用Message模式

3.WSDualHttpBinding不支持Transport模式

 

下面看一下,在传输模式下(Transport、Message),身份验证与binding的关系

在Transport模式下:

名称

None

Windows

UserName

Certificate

BasicHttpBinding

Yes(默认)

Yes

Yes

Yes

NetTcpBinding

Yes

Yes(默认)

No

Yes

NetNamedPipeBinding

No

Yes(默认)

No

No

WSHttpBinding

Yes

Yes(默认)

Yes

Yes

WSDualHttpBinding

    

NetMsmqBinding

Yes

Yes(默认)

No

Yes

 

所有的局域网绑定都支持Windows方式的身份验证

NetTcpBinding在Transport模式下不支持UserName身份验证模式

wsDualHttpBinding不支持Transport传输安全模式的

D{NJZVIHK6DYSTSY{QMS(DX

 

在Message传输安全模式下Binding与身份验证:

名称

None

Windows

UserName

Certificate

IssuedToken

BasicHttpBinding

No

No

No

Yes

No

NetTcpBinding

Yes

Yes(默认)

Yes

Yes

Yes

NetNamedPipeBinding

     

WSHttpBinding

Yes

Yes(默认)

Yes

Yes

Yes

WSDualHttpBinding

Yes

Yes(默认)

Yes

Yes

Yes

NetMsmqBinding

Yes

Yes(默认)

Yes

Yes

Yes

除了BasicHttpBinding和NetNamedPipeBinding以外,其他的模式默认都是用Windows凭证

Http协议上是用Windows验证,比较诡异.

书上的说法是:是为了在选定正确的传输安全下,让用户安全的使用WCF直接提供的各种绑定,而不是首先求助于定制凭证库.

转载于:https://www.cnblogs.com/wangshuai/archive/2010/06/02/1750101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"java.io.IOException: Stream closed"是一个常见的错误消息,它表示在处理输入或输出流时出现了问题。在Java中,输入和输出流是用于读取和写入数据的工具。 通常情况下,抛出这个异常的原因是由于输入或输出流在操作之前已被关闭。当我们使用Java的IO类进行输入或输出操作时,我们需要按照一定的顺序正确关闭流,以避免出现此错误。 在遇到这个错误消息时,我们可以检查以下几个方面: 1. 检查是否正确地打开和关闭了输入或输出流。在使用完流之后,我们应该使用`close()`方法来关闭流。 例如,在读取文件时,我们应该使用以下代码片段: ```java try { FileInputStream file = new FileInputStream("myfile.txt"); // 读取文件的代码逻辑 } catch (IOException e) { e.printStackTrace(); } finally { try { if (file != null) { file.close(); // 关闭流 } } catch (IOException e) { e.printStackTrace(); } } ``` 2. 检查代码中是否存在多个线程尝试共享同一个流。当多个线程同时对同一个流进行操作时,可能会导致其中一个线程关闭了流,而其他线程尝试读取或写入数据时抛出"Stream closed"异常。确保在多线程环境中正确同步流的访问。 3. 检查流对象是否被重复使用。有时我们可能会在多个地方使用相同的流对象进行读写操作。如果在一次操作之后关闭了流,在后续操作中再次使用该流对象将导致"Stream closed"异常。确保每次操作都使用一个新的流对象。 总之,当遇到"java.io.IOException: Stream closed"异常时,我们应该仔细检查流的打开和关闭过程,确保在正确的时间关闭流,并避免多个线程或重复使用流对象造成的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值