· 问题
关于 web service 就不用多说了。以下说明我们在使用web service经常碰到的问题:
1、web service接口的安全性:web service的接口是直接暴露在web(虽然可以通过一些方式来验证访问者的身份,但实现起来都比较麻烦,或者性能不佳),另如何防止重放攻击也是个问题;
2、web service数据在web上传输是使用明文的方式,数据容易被非法拦截或篡改;
3、web service需要传输较多的数据时的性能需要如何优化。
· 解决
使用 soap extension来解决以上的问题:
1、在soap头加入身份认证信息(称为Passport),Passport身份的一个凭证,在客户端和服务器端都有保存,验证时必须相匹配。passport在soap头是个报文数据,包含执行身份验证需要的信息。passport使用事务标识来防止重放攻击,即有服务端发出事务标识供客户端使用,客户端发出请求时必须包含该事务标识,当服务端响应后,服务端注销原来的事务标识并生成新的事务标识;
2、数据保护,使用数据摘要或对数据进行加密;
3、数据压缩,在数据传输前对数据进行压缩。
· 、概述
本组件在实现上是通过使用Soap扩展(Passport协议)和SecurityExtension协议来实现对Web Service 的扩展。组件提供3个功能:
1、身份认证
身份认证由Passport协议实现的。登陆、登出以及结束异步事务是通过专门的Passport服务接口(WebService)发送 Passport包实现的。服务请求是通过加入自定义的Soap头(包含有Passport包)来实现的。
客户端要请求WebService 服务必须先在本地创建执照,并发出登陆请求时,服务端接受到登陆请求,注册客户执照,并把更改后的执照返回给客户段。在以后的服务请求中,根据Passport协议个规定,客户端和服务端不断修改执照信息来完成身份的验证。
身份认证中在服务器端保存的执照信息采用缓存的方式,当超过一定时间将被注销。
1.1、简单执照验证
简单执照密码验证包括登陆、请求、登出三个部分。
登陆在实现上是向服务器专门的Passport访问通道(WebService)发送加密过身份认证的信息(包括用户名、密码、登记号)。服务器解析身份认证信息,并验证用户名和密码(这个验证过程实施者必须重写),当用户名和密码验证通过后,服务端根据登记号在服务器注册其登记号,如果该登记号已经存在,这登陆失败。注册完登记号,服务器将产生一个执照(Guid同登记号),加密后返回给登陆请求者,这时完成登陆。之后客户端发出的请求必须包含此执照,直至登出。
服务请求过程中,客户端发出的服务请求中包含服务器授予的执照,服务器接收到请求后,首先验证此执照的正确性。通过验证后,执行请求的内容,返回给客户端。
登出时,服务器将注销授予给客户端的执照,客户端如果还要服务请求必须先登陆。
1.2、事务执照验证
事务执照验证包括登陆、服务请求、登出三个部分。
登陆请求和简单执照验证一样。不同的是服务器注册登记号后,产生一个执照,该执照包含一个事务登记号,事务登记号只能使用一次(同步的状态下)。服务器把执照返回给客户端完成登陆。
服务请求的过程分为2种类型:一种是同步的方式,即客户端发出一个请求后,在接受到服务器响应后再发下一个请求;另一种是异步的方式,即客户端同时向服务器发出多个请求。
同步的方式中,当客户端发出服务请求中包含服务器授予的执照,如果请求中的事务ID尚未被注册,服务器则拒绝服务。事务ID验证通过后,服务器更新事务ID并销毁原事务ID。接着执行请求内容,完成客户端的请求,并发送更新后的执照给客户端。
异步的方式中,客户端在服务器授予的执照加入异步标识号(称异步ID),发送给服务器,服务端接收到这样的执照后,先执行事务验证。事务验证通过后,验证此事务的异步 ID是否已经被注册,如果已经被注册,则拒绝服务。异步验证通过后,服务端注册异步ID,执行请求内容后把执照在发回给客户端。注意,执照并没有发生改变,同一批异步请求共用一个事务ID。当客户端确认要结束本次的异步请求时(客户端必须确保所有的线程的请求已经结束),发送结束异步请求信息(包括事务ID和结束标志)。服务端将注销该异步请求的所有信息,并生成新的事务ID和更新执照。
登出时,客户端发送登出请求。服务端将注销所有本次登陆在服务端注册的信息,完成登出。
2、数据保护
通过数据摘要的方式来验证数据的完整性,同时也可以使用数据加密的方式防止重要的数据被非法截获。
3、数据压缩
对webservice的请求和响应的数据进行压缩,默认使用rfc1951描述的进行压缩。实施者可以重写压缩方式。
· 细节
1、Passport
Passport为客户端进行web service 请求和确认服务响应的一种证书。Passport往返于客户端和服务器之间(通过PassportInfo),而且双方在本地都通过管理器保存有Passport的副本。Passport的生成是服务器根据客户端发出登记号产生的,简单执照验证中,Passport一经生成就不在修改,客户端可以重复使用直到登出。而事务执照验证中,Passport中的事务ID将不断改变,这个改变是由服务器发起的,当服务器接受到Passport,验证通过后(登记号和事务ID)将生成新的事务ID并销毁原来的事务ID。对于异步多个请求的方式,服务器将认为是同一个事务,而使用异步ID加以注册。
执照信息(PassportInfo)是保存在Passport服务接口的参数或者命名为Passport的Soap头里,内容是Passport协议报文数据经过加密和Base64编码过的数据。报文内容如下:
Passport协议
报文:
报文标记开头(PS) |
D |
保留 |
验证类型 |
请求类型 |
PassportID(16字节) |
||||
Username(16字节)(可选) |
||||
Password(16字节)(可选) |
||||
TransactionID(16字节)(可选) |
||||
LastTransactionID(16字节)(可选) |
||||
AsynchronismID(16字节)(可选) |
报文标记开头:16位,固定为PS。
D:1位,报文发送者(0客户端/1服务端)
保留:7位
验证类型:4位
0x0:无验证
0x1:简单执照验证
0x2:事务执照验证
请求类型:4位
请求类型 |
说明 |
验证类型 |
D为0时 |
D为1时 |
0x1 |
登陆请求 |
0x1 |
Username、Password必须 |
|
0x2 |
TransactionID |
|||
0x2 |
服务请求 |
0x1 |
|
|
0x2 |
TransactionID 必须 |
TransactionID,LastTransactionID 必须 |
||
0x4 |
异步服务请求 |
0x2 |
TransactionID,AsynchronismID必须 |
TransactionID,AsynchronismID必须 |
0x5 |
结束异步服务请求 |
0x2 |
TransactionID |
TransactionID,LastTransactionID 必须 |
0xf |
登出请求 |
0x1 |
|
|
0x2 |
|
|
PassportInfo先由客户端发出,服务器接收后,进行响应和修改,返回给客户端,客户端对接收到的 PassportInfo 进行验证(PassportID和