博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构建安全的Xml Web Service系列之初探使用Soap头
阅读量:6594 次
发布时间:2019-06-24

本文共 5094 字,大约阅读时间需要 16 分钟。

原文:

    Xml Web Service 从诞生那天就说自己都么都么好,还津津乐道的说internet也会因此而进入一个新纪元,可5年多来,Xml Web Service并没有像当初宣扬的那样火起来,尽管在一些领域之内,也有人牛刀小试,但从整体而言,Service还并没有得到广泛的应用,原因有很多,有一些来源于目前各大厂商都坚持自己的service标准,不能形成统一,也有对现有的稳定系统不愿进行更改的原因,但还包括web service本身的原因,最明显的应该是两个:1) 安全,2)性能。毕业设计的时候,写的是高性能web service的开发和应用,下面,我想用几篇文章来阐述一下有关xml web service安全的几个解决方案。欢迎各位大虾来砸。

    如何解决网络服务的安全问题,我主要从以下两个层面进行分析:
   1) 确保调用者的合法身份-保证来源的合法
   2) 在传输中不被非法监听和篡改。
当然还会有其他方面的安全隐患,希望大家能多多提出,我也好能进一步总结。
   如果您想更快的掌握本文提到的技术,您以前必须了解xml web service的工作原理,并且亲自开发并部署或者使用过Xml web service,只是您并不相信您部署的xml web service是安全的。
 本节先介绍一种最为简单的确保调用者合法的解决方案-将用户名和密码附加在Soap消息头部,在服务器端进行用户名密码验证。这种方式从解决了原网络服务不能针对特定对象产生响应的问题。但因为仍以明文格式
传输,所以不能有效地防止信息在传输过程中被偷窥,篡改或伪造。
  如果您以前已经使用了这种方法,请略过此篇文章,我下篇文章中将讲述其他方式,更加合理的解决方案,欢迎您继续关注。
   下面是实现此种解决方案的步骤,请您一步一步来
  第一步:首先您需要创建一个Xml Web Service的服务项目,创建方法如下
     打开visual studio 2005,在起始页上点击创建项目,选择visual C#中的Asp.Net web 服务应用程序,输入项目名称
  第二步:在该项目中创建一个扩展的SoapHeader对象MySoapHeader,如下
  

img_1c53668bcee393edac0d7b3b3daff1ae.gif
img_405b18b4b6584ae338e0f6ecaf736533.gif
MySoapHeader
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Data;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Configuration;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.Security;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.UI;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.UI.WebControls;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.UI.WebControls.WebParts;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.UI.HtmlControls;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.Services.Protocols;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
namespace
 WebService1
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif    
public
 
class
 MySoapHeader:SoapHeader
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif        
private
 
string
 _userName;
img_33d02437d135341f0800e3d415312ae8.gif        
private
 
string
 _pwd;
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**/
///
 
<summary>
img_33d02437d135341f0800e3d415312ae8.gif        
///
 用户名
img_105a1e124122b2abcee4ea8e9f5108f3.gif        
///
 
</summary>
img_33d02437d135341f0800e3d415312ae8.gif
        
public
 
string
 UserName
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif            
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                
return
 _userName;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_33d02437d135341f0800e3d415312ae8.gif            
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                _userName 
=
 value;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**/
///
 
<summary>
img_33d02437d135341f0800e3d415312ae8.gif        
///
 密码
img_105a1e124122b2abcee4ea8e9f5108f3.gif        
///
 
</summary>
img_33d02437d135341f0800e3d415312ae8.gif
        
public
 
string
 Pwd
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif            
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                
return
 _pwd;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_33d02437d135341f0800e3d415312ae8.gif            
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                _pwd 
=
 value;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }
img_05dd8d549cff04457a6366b0a7c9352a.gif}
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
第三步:创建一个Xml Web Service,另添加一个要求使用SoapHeader的网络服务方法
  
img_1c53668bcee393edac0d7b3b3daff1ae.gif
img_405b18b4b6584ae338e0f6ecaf736533.gif
WebService
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Data;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Collections;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.Services;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Web.Services.Protocols;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.ComponentModel;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
namespace
 WebService1
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
/**/
///
 
<summary>
img_33d02437d135341f0800e3d415312ae8.gif    
///
 Service1 的摘要说明
img_105a1e124122b2abcee4ea8e9f5108f3.gif    
///
 
</summary>
img_33d02437d135341f0800e3d415312ae8.gif
    [WebService(Namespace 
=
 
"
http://tempuri.org/
"
)]
img_33d02437d135341f0800e3d415312ae8.gif    [WebServiceBinding(ConformsTo 
=
 WsiProfiles.BasicProfile1_1)]
img_33d02437d135341f0800e3d415312ae8.gif    [ToolboxItem(
false
)]
img_33d02437d135341f0800e3d415312ae8.gif    
public
 
class
 Service1 : System.Web.Services.WebService
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif        
public
 MySoapHeader header 
=
 
new
 MySoapHeader();        
img_33d02437d135341f0800e3d415312ae8.gif        [WebMethod]
img_33d02437d135341f0800e3d415312ae8.gif        [SoapHeader(
"
header
"
)]       
img_33d02437d135341f0800e3d415312ae8.gif        
public
 
string
 HelloWorld()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif            
if
 (header 
==
 
null
)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                
return
 
"
您没有设置SoapHeader,不能正常访问此服务!
"
;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_33d02437d135341f0800e3d415312ae8.gif            
if
 (header.UserName 
!=
 
"
jillzhang
"
 
||
 header.Pwd 
!=
 
"
123456
"
)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif                
return
 
"
您提供的身份验证信息有误,不能正常访问此服务!
"
;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }
img_33d02437d135341f0800e3d415312ae8.gif            
return
 
"
Hello World
"
;
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }
img_05dd8d549cff04457a6366b0a7c9352a.gif}
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
  第四步:创建一个调用Xml Web Service的Console应用程序,如下:
img_1c53668bcee393edac0d7b3b3daff1ae.gif
img_405b18b4b6584ae338e0f6ecaf736533.gif
TestConsole
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Collections.Generic;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using
 System.Text;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
namespace
 ConsoleApplication1
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif    
class
 Program
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif       
img_33d02437d135341f0800e3d415312ae8.gif        
static
 
void
 Main(
string
[] args)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
{
img_33d02437d135341f0800e3d415312ae8.gif            localhost.Service1 ws 
=
 
new
 ConsoleApplication1.localhost.Service1();
img_33d02437d135341f0800e3d415312ae8.gif            
//
ws.MySoapHeaderValue = new ConsoleApplication1.localhost.MySoapHeader();
img_33d02437d135341f0800e3d415312ae8.gif            
//
ws.MySoapHeaderValue.UserName = "jillzhang";
img_33d02437d135341f0800e3d415312ae8.gif            
//
ws.MySoapHeaderValue.Pwd = "123456";
img_33d02437d135341f0800e3d415312ae8.gif
            Console.WriteLine(ws.HelloWorld());
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }
img_05dd8d549cff04457a6366b0a7c9352a.gif}
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
 
下面的分析,对于大家来说,应该是最重要的,很多人不清楚SoapHeader的工作原理,为什么这么怪异的写法竟能产生神奇的效果,下面我将不同情形下的Soap消息解析出来,大家仔细观察这个信息,并可以清晰地掌握了SoapHeader的工作原理了.
首先,先看看没有设置SoapHeader的情况下,Soap消息为:
 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
-----Soap请求 在 2007年05月22日 12时39分40秒
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope 
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
><
soap:Body
><
HelloWorld 
xmlns
="http://tempuri.org/"
 
/></
soap:Body
></
soap:Envelope
>
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif-----Soap响应 在 2007年05月22日 12时39分40秒
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope 
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
><
soap:Body
><
HelloWorldResponse 
xmlns
="http://tempuri.org/"
><
HelloWorldResult
>
您提供的身份验证信息有误,不能正常访问此服务!
</
HelloWorldResult
></
HelloWorldResponse
></
soap:Body
></
soap:Envelope
>
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
再看看在设置了SoapHeader之后的Soap的请求和响应信息
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
-----Soap请求 在 2007年05月22日 12时42分20秒
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope 
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
><
soap:Header
><
MySoapHeader 
xmlns
="http://tempuri.org/"
><
UserName
>
jillzhang
</
UserName
><
Pwd
>
123456
</
Pwd
></
MySoapHeader
></
soap:Header
><
soap:Body
><
HelloWorld 
xmlns
="http://tempuri.org/"
 
/></
soap:Body
></
soap:Envelope
>
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif-----Soap响应 在 2007年05月22日 12时42分20秒
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope 
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
><
soap:Body
><
HelloWorldResponse 
xmlns
="http://tempuri.org/"
><
HelloWorldResult
>
Hello World
</
HelloWorldResult
></
HelloWorldResponse
></
soap:Body
></
soap:Envelope
>
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
大家可以比较前后两个Soap消息的异同,会发现,加了SoapHeader的请求SoapMessage比没有加的多了一个节
点<soap:Header>正是通过这个节点,SoapMessage将信息传递给了网络服务端,网络服务端便可以从中解析出来,并加以处理,从上面的SoapMessage中,我们也看出,用户名和密码是以明文的格式传输的,这样,SoapHeader就更像Http协议中的Cookie了,我们可以参考Cookie的使用,来扩展SoapHeader,让它变得更加安全些,但总的看来,通过直接设置SoapHeader的方法提高安全性还是有一定限制的。在安全不是特别重要的应用情形中,推荐采用此种解决方案,因为它方便快捷,灵活易用。
有关Cookie的信息,请参考前期文章:
下一节,我将介绍一下,如何获取SoapMessage.

转载地址:http://hnjio.baihongyu.com/

你可能感兴趣的文章
Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序
查看>>
工作的准备:atoi,itoa,strcpy,memcpy,strcmp,二分查找,strcat
查看>>
Android 在闹钟开机时,如何解决开机动画没有播完就进入Launcher M
查看>>
2014第11周三
查看>>
jQuery File Upload跨域上传
查看>>
重构第27天 去除上帝类(Remove God Classes)
查看>>
用 Hexo + Next + GitHubPages 搭建漂亮的免费博客
查看>>
近期暴涨的BCH前景利好还是利空?未来能否撼动龙头老大的地位?
查看>>
少侠,留步,图片预览术
查看>>
304与缓存
查看>>
前端面试题-display:none和visibility:hidden的区别
查看>>
ES6小记
查看>>
Vue.js源码学习三 —— 事件 Event 学习
查看>>
vscode编辑器
查看>>
nuxt element-ui 上cdn
查看>>
利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)
查看>>
学习笔记CB004:提问、检索、回答、NLPIR
查看>>
Android性能优化之UI实战
查看>>
Facebook Docusaurus 中文文档 siteConfig.js 详解
查看>>
iMooc-张鑫旭 CSS
查看>>