构建安全的Xml Web Service系列之初探使用Soap头
生活随笔
收集整理的這篇文章主要介紹了
构建安全的Xml Web Service系列之初探使用Soap头
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Xml Web Service 從誕生那天就說自己都么都么好,還津津樂道的說internet也會(huì)因此而進(jìn)入一個(gè)新紀(jì)元,可5年多來,Xml Web Service并沒有像當(dāng)初宣揚(yáng)的那樣火起來,盡管在一些領(lǐng)域之內(nèi),也有人牛刀小試,但從整體而言,Service還并沒有得到廣泛的應(yīng)用,原因有很多,有一些來源于目前各大廠商都堅(jiān)持自己的service標(biāo)準(zhǔn),不能形成統(tǒng)一,也有對(duì)現(xiàn)有的穩(wěn)定系統(tǒng)不愿進(jìn)行更改的原因,但還包括web service本身的原因,最明顯的應(yīng)該是兩個(gè):1) 安全,2)性能。畢業(yè)設(shè)計(jì)的時(shí)候,寫的是高性能web service的開發(fā)和應(yīng)用,下面,我想用幾篇文章來闡述一下有關(guān)xml web service安全的幾個(gè)解決方案。歡迎各位大蝦來砸。
????如何解決網(wǎng)絡(luò)服務(wù)的安全問題,我主要從以下兩個(gè)層面進(jìn)行分析:
?? 1) 確保調(diào)用者的合法身份-保證來源的合法
?? 2) 在傳輸中不被非法監(jiān)聽和篡改。
當(dāng)然還會(huì)有其他方面的安全隱患,希望大家能多多提出,我也好能進(jìn)一步總結(jié)。
???如果您想更快的掌握本文提到的技術(shù),您以前必須了解xml web service的工作原理,并且親自開發(fā)并部署或者使用過Xml web service,只是您并不相信您部署的xml web service是安全的。
?本節(jié)先介紹一種最為簡(jiǎn)單的確保調(diào)用者合法的解決方案-將用戶名和密碼附加在Soap消息頭部,在服務(wù)器端進(jìn)行用戶名密碼驗(yàn)證。這種方式從解決了原網(wǎng)絡(luò)服務(wù)不能針對(duì)特定對(duì)象產(chǎn)生響應(yīng)的問題。但因?yàn)槿砸悦魑母袷?br /> 傳輸,所以不能有效地防止信息在傳輸過程中被偷窺,篡改或偽造。
? 如果您以前已經(jīng)使用了這種方法,請(qǐng)略過此篇文章,我下篇文章中將講述其他方式,更加合理的解決方案,歡迎您繼續(xù)關(guān)注。
???下面是實(shí)現(xiàn)此種解決方案的步驟,請(qǐng)您一步一步來
? 第一步:首先您需要?jiǎng)?chuàng)建一個(gè)Xml Web Service的服務(wù)項(xiàng)目,創(chuàng)建方法如下
?????打開visual studio 2005,在起始頁上點(diǎn)擊創(chuàng)建項(xiàng)目,選擇visual C#中的Asp.Net web 服務(wù)應(yīng)用程序,輸入項(xiàng)目名稱
??第二步:在該項(xiàng)目中創(chuàng)建一個(gè)擴(kuò)展的SoapHeader對(duì)象MySoapHeader,如下
?? MySoapHeader
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Web.UI.WebControls.WebParts;
using?System.Web.UI.HtmlControls;
using?System.Web.Services.Protocols;
namespace?WebService1
{
????public?class?MySoapHeader:SoapHeader
????{
????????private?string?_userName;
????????private?string?_pwd;
????????/**////?<summary>
????????///?用戶名
????????///?</summary>
????????public?string?UserName
????????{
????????????get
????????????{
????????????????return?_userName;
????????????}
????????????set
????????????{
????????????????_userName?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?密碼
????????///?</summary>
????????public?string?Pwd
????????{
????????????get
????????????{
????????????????return?_pwd;
????????????}
????????????set
????????????{
????????????????_pwd?=?value;
????????????}
????????}
????}
}
第三步:創(chuàng)建一個(gè)Xml Web Service,另添加一個(gè)要求使用SoapHeader的網(wǎng)絡(luò)服務(wù)方法
?? WebService
using?System;
using?System.Data;
using?System.Web;
using?System.Collections;
using?System.Web.Services;
using?System.Web.Services.Protocols;
using?System.ComponentModel;
namespace?WebService1
{
????/**////?<summary>
????///?Service1?的摘要說明
????///?</summary>
????[WebService(Namespace?=?"http://tempuri.org/")]
????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
????[ToolboxItem(false)]
????public?class?Service1?:?System.Web.Services.WebService
????{
????????public?MySoapHeader?header?=?new?MySoapHeader();????????
????????[WebMethod]
????????[SoapHeader("header")]???????
????????public?string?HelloWorld()
????????{
????????????if?(header?==?null)
????????????{
????????????????return?"您沒有設(shè)置SoapHeader,不能正常訪問此服務(wù)!";
????????????}
????????????if?(header.UserName?!=?"jillzhang"?||?header.Pwd?!=?"123456")
????????????{
????????????????return?"您提供的身份驗(yàn)證信息有誤,不能正常訪問此服務(wù)!";
????????????}
????????????return?"Hello?World";
????????}
????}
}
??第四步:創(chuàng)建一個(gè)調(diào)用Xml Web Service的Console應(yīng)用程序,如下:
TestConsole
using?System;
using?System.Collections.Generic;
using?System.Text;
namespace?ConsoleApplication1
{
????class?Program
????{
???????
????????static?void?Main(string[]?args)
????????{
????????????localhost.Service1?ws?=?new?ConsoleApplication1.localhost.Service1();
????????????//ws.MySoapHeaderValue?=?new?ConsoleApplication1.localhost.MySoapHeader();
????????????//ws.MySoapHeaderValue.UserName?=?"jillzhang";
????????????//ws.MySoapHeaderValue.Pwd?=?"123456";
????????????Console.WriteLine(ws.HelloWorld());
????????}
????}
}
? 下面的分析,對(duì)于大家來說,應(yīng)該是最重要的,很多人不清楚SoapHeader的工作原理,為什么這么怪異的寫法竟能產(chǎn)生神奇的效果,下面我將不同情形下的Soap消息解析出來,大家仔細(xì)觀察這個(gè)信息,并可以清晰地掌握了SoapHeader的工作原理了.
首先,先看看沒有設(shè)置SoapHeader的情況下,Soap消息為:
? -----Soap請(qǐng)求?在?2007年05月22日?12時(shí)39分40秒
<?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>
-----Soap響應(yīng)?在?2007年05月22日?12時(shí)39分40秒
<?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>您提供的身份驗(yàn)證信息有誤,不能正常訪問此服務(wù)!</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
再看看在設(shè)置了SoapHeader之后的Soap的請(qǐng)求和響應(yīng)信息
-----Soap請(qǐng)求?在?2007年05月22日?12時(shí)42分20秒
<?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>
-----Soap響應(yīng)?在?2007年05月22日?12時(shí)42分20秒
<?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>
大家可以比較前后兩個(gè)Soap消息的異同,會(huì)發(fā)現(xiàn),加了SoapHeader的請(qǐng)求SoapMessage比沒有加的多了一個(gè)節(jié)
點(diǎn)<soap:Header>正是通過這個(gè)節(jié)點(diǎn),SoapMessage將信息傳遞給了網(wǎng)絡(luò)服務(wù)端,網(wǎng)絡(luò)服務(wù)端便可以從中解析出來,并加以處理,從上面的SoapMessage中,我們也看出,用戶名和密碼是以明文的格式傳輸?shù)?#xff0c;這樣,SoapHeader就更像Http協(xié)議中的Cookie了,我們可以參考Cookie的使用,來擴(kuò)展SoapHeader,讓它變得更加安全些,但總的看來,通過直接設(shè)置SoapHeader的方法提高安全性還是有一定限制的。在安全不是特別重要的應(yīng)用情形中,推薦采用此種解決方案,因?yàn)樗奖憧旖?#xff0c;靈活易用。
????如何解決網(wǎng)絡(luò)服務(wù)的安全問題,我主要從以下兩個(gè)層面進(jìn)行分析:
?? 1) 確保調(diào)用者的合法身份-保證來源的合法
?? 2) 在傳輸中不被非法監(jiān)聽和篡改。
當(dāng)然還會(huì)有其他方面的安全隱患,希望大家能多多提出,我也好能進(jìn)一步總結(jié)。
???如果您想更快的掌握本文提到的技術(shù),您以前必須了解xml web service的工作原理,并且親自開發(fā)并部署或者使用過Xml web service,只是您并不相信您部署的xml web service是安全的。
?本節(jié)先介紹一種最為簡(jiǎn)單的確保調(diào)用者合法的解決方案-將用戶名和密碼附加在Soap消息頭部,在服務(wù)器端進(jìn)行用戶名密碼驗(yàn)證。這種方式從解決了原網(wǎng)絡(luò)服務(wù)不能針對(duì)特定對(duì)象產(chǎn)生響應(yīng)的問題。但因?yàn)槿砸悦魑母袷?br /> 傳輸,所以不能有效地防止信息在傳輸過程中被偷窺,篡改或偽造。
? 如果您以前已經(jīng)使用了這種方法,請(qǐng)略過此篇文章,我下篇文章中將講述其他方式,更加合理的解決方案,歡迎您繼續(xù)關(guān)注。
???下面是實(shí)現(xiàn)此種解決方案的步驟,請(qǐng)您一步一步來
? 第一步:首先您需要?jiǎng)?chuàng)建一個(gè)Xml Web Service的服務(wù)項(xiàng)目,創(chuàng)建方法如下
?????打開visual studio 2005,在起始頁上點(diǎn)擊創(chuàng)建項(xiàng)目,選擇visual C#中的Asp.Net web 服務(wù)應(yīng)用程序,輸入項(xiàng)目名稱
??第二步:在該項(xiàng)目中創(chuàng)建一個(gè)擴(kuò)展的SoapHeader對(duì)象MySoapHeader,如下
?? MySoapHeader
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Web.UI.WebControls.WebParts;
using?System.Web.UI.HtmlControls;
using?System.Web.Services.Protocols;
namespace?WebService1
{
????public?class?MySoapHeader:SoapHeader
????{
????????private?string?_userName;
????????private?string?_pwd;
????????/**////?<summary>
????????///?用戶名
????????///?</summary>
????????public?string?UserName
????????{
????????????get
????????????{
????????????????return?_userName;
????????????}
????????????set
????????????{
????????????????_userName?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?密碼
????????///?</summary>
????????public?string?Pwd
????????{
????????????get
????????????{
????????????????return?_pwd;
????????????}
????????????set
????????????{
????????????????_pwd?=?value;
????????????}
????????}
????}
}
第三步:創(chuàng)建一個(gè)Xml Web Service,另添加一個(gè)要求使用SoapHeader的網(wǎng)絡(luò)服務(wù)方法
?? WebService
using?System;
using?System.Data;
using?System.Web;
using?System.Collections;
using?System.Web.Services;
using?System.Web.Services.Protocols;
using?System.ComponentModel;
namespace?WebService1
{
????/**////?<summary>
????///?Service1?的摘要說明
????///?</summary>
????[WebService(Namespace?=?"http://tempuri.org/")]
????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
????[ToolboxItem(false)]
????public?class?Service1?:?System.Web.Services.WebService
????{
????????public?MySoapHeader?header?=?new?MySoapHeader();????????
????????[WebMethod]
????????[SoapHeader("header")]???????
????????public?string?HelloWorld()
????????{
????????????if?(header?==?null)
????????????{
????????????????return?"您沒有設(shè)置SoapHeader,不能正常訪問此服務(wù)!";
????????????}
????????????if?(header.UserName?!=?"jillzhang"?||?header.Pwd?!=?"123456")
????????????{
????????????????return?"您提供的身份驗(yàn)證信息有誤,不能正常訪問此服務(wù)!";
????????????}
????????????return?"Hello?World";
????????}
????}
}
??第四步:創(chuàng)建一個(gè)調(diào)用Xml Web Service的Console應(yīng)用程序,如下:
TestConsole
using?System;
using?System.Collections.Generic;
using?System.Text;
namespace?ConsoleApplication1
{
????class?Program
????{
???????
????????static?void?Main(string[]?args)
????????{
????????????localhost.Service1?ws?=?new?ConsoleApplication1.localhost.Service1();
????????????//ws.MySoapHeaderValue?=?new?ConsoleApplication1.localhost.MySoapHeader();
????????????//ws.MySoapHeaderValue.UserName?=?"jillzhang";
????????????//ws.MySoapHeaderValue.Pwd?=?"123456";
????????????Console.WriteLine(ws.HelloWorld());
????????}
????}
}
? 下面的分析,對(duì)于大家來說,應(yīng)該是最重要的,很多人不清楚SoapHeader的工作原理,為什么這么怪異的寫法竟能產(chǎn)生神奇的效果,下面我將不同情形下的Soap消息解析出來,大家仔細(xì)觀察這個(gè)信息,并可以清晰地掌握了SoapHeader的工作原理了.
首先,先看看沒有設(shè)置SoapHeader的情況下,Soap消息為:
? -----Soap請(qǐng)求?在?2007年05月22日?12時(shí)39分40秒
<?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>
-----Soap響應(yīng)?在?2007年05月22日?12時(shí)39分40秒
<?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>您提供的身份驗(yàn)證信息有誤,不能正常訪問此服務(wù)!</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
再看看在設(shè)置了SoapHeader之后的Soap的請(qǐng)求和響應(yīng)信息
-----Soap請(qǐng)求?在?2007年05月22日?12時(shí)42分20秒
<?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>
-----Soap響應(yīng)?在?2007年05月22日?12時(shí)42分20秒
<?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>
大家可以比較前后兩個(gè)Soap消息的異同,會(huì)發(fā)現(xiàn),加了SoapHeader的請(qǐng)求SoapMessage比沒有加的多了一個(gè)節(jié)
點(diǎn)<soap:Header>正是通過這個(gè)節(jié)點(diǎn),SoapMessage將信息傳遞給了網(wǎng)絡(luò)服務(wù)端,網(wǎng)絡(luò)服務(wù)端便可以從中解析出來,并加以處理,從上面的SoapMessage中,我們也看出,用戶名和密碼是以明文的格式傳輸?shù)?#xff0c;這樣,SoapHeader就更像Http協(xié)議中的Cookie了,我們可以參考Cookie的使用,來擴(kuò)展SoapHeader,讓它變得更加安全些,但總的看來,通過直接設(shè)置SoapHeader的方法提高安全性還是有一定限制的。在安全不是特別重要的應(yīng)用情形中,推薦采用此種解決方案,因?yàn)樗奖憧旖?#xff0c;靈活易用。
轉(zhuǎn)載于:https://www.cnblogs.com/humors/archive/2008/10/16/1312400.html
總結(jié)
以上是生活随笔為你收集整理的构建安全的Xml Web Service系列之初探使用Soap头的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目管理实战之团队管理 (转)
- 下一篇: 发布前禁用调试