什么是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的原型。