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

posted on 2013-03-08 18:49  STM85  阅读(7385)  评论(1编辑  收藏  举报

导航