WebService+SOAP实现数据加密
什么是WebService,请参考上一篇>>
1.什么是SOAP?
2.WebService中,如何登录SOAP,且调用方法。
3.如何保证数据存放在SOAP中,且数据在传输过程中不被窃取呢?
什么是SOAP
SOAP(Simple Object Access Protocol),简单对象访问协议。是基于WebService进行数据交换的一种协议。
具体请参考维基百科。
如何保证我们的WebService安全呢?
当我们开发出一个WebService接口,但该接口只允许有权限的系统调用,那我们得怎样做到这一点呢?
首先,我们可以定义自己的SOAP头,来进行权限验证,代码如下:
public class Authenticate : SoapHeader { public Authenticate() { // //TODO: 在此处添加构造函数逻辑 // } public string Name {get;set;} // 验证用户名 public string Password {get;set;} // 验证密码 }
当定义好SOAP头,我们便可以在项目中使用它了,如下:
public class ServiceBase : System.Web.Services.WebService { public Authenticate authenticate = null; [WebMethod] [SoapHeader("authenticate")] public string Test() { if (IsLogin()) { return "权限不足!"; } return "成功调用Test方法!"; } // 判断SOAP是否登录 private bool IsLogin() { return null == authenticate; } }
这样,我们就可以使用SOAP来进行数据传输。此处只简单的介绍验证,具体如何判断是否本系统调用,可结合数据库或配置文件来实现,这里只介绍Soap在WebService中的应用。
如何保证数据存放在SOAP中,且数据在传输过程中不被窃取呢?
在.net中,我们可对SOAP进行扩展。
首先,在web.config中加入对SOAP扩展类的定义,如:
在<system.web>节点中增加如下节点:
<webServices>
<soapExtensionTypes>
<add type="Soap.MySoapExtension, App_Code.iswxunq-" />
</soapExtensionTypes>
</webServices>
Soap.MySoapExtension是扩展类名称,App_Code.iswxunq-是程序集名称;
其次,新建MySoapExtension扩展类,如下:
public class MySoapExtension : SoapExtension // 须继承SoapExtension { public MySoapExtension() {} private Stream newStream = null, oldStream = null; // 每次对数据进行操作,都会执行该方法,故须对数据进行备份,以备处理 public override Stream ChainStream(Stream stream) { oldStream = stream; newStream = new MemoryStream(); return newStream; } public override object GetInitializer(Type serviceType) { return null; } public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } public override void Initialize(object initializer) { } public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: break; case SoapMessageStage.BeforeDeserialize: // 此处可处理首次请求的数据,如对数据进行解密 // 如解析oldStream的数据,操作完数据后,须把数据重新写到内存流,以便数据得以更新后传到WebService中 break; case SoapMessageStage.AfterSerialize: // 数据返回时,在此处处理,如对返回数据进行加密 // 如把oldStream的数据进行加密,加密完成后,须将oldStream的数据重新写到内存流中,以便返回给调用者是加密后的数据 break; case SoapMessageStage.AfterDeserialize: break; default: break; } } }
只要我们进行了如上的配置,与扩展SoapExtension类,故每次请求WebService时,系统都会自动的调用ProcessMessage方法。
这就是WebService + Soap对数据进行加密处理。在Soap中,数据是以XML的格式进行传输,故我们在ProcessMessage方法的BeforeDeserialize中,可进行断点调试,以便查看Soap的原型。