如何解決網絡服務的安全問題,我主要從以下兩個層面進行分析:
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,如下
以下是引用片段:
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;
}
}
}
}
第三步:創建一個XML Web Service,另添加一個要求使用SoapHeader的網絡服務方法
以下是引用片段:
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")]
第四步:創建一個調用XML Web Service的Console應用程序,如下:
以下是引用片段:
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());
}
}
}
下面的分析,對於大家來說,應該是最重要的,很多人不清楚SoapHeader的工作原理,為什麼這麼怪異的寫法竟能產生神奇的效果,下面我將不同情形下的Soap消息解析出來,大家仔細觀察這個信息,並可以清晰地掌握了SoapHeader的工作原理了.
首先,先看看沒有設置SoapHeader的情況下,Soap消息為:
以下是引用片段:
-----Soap請求 在 2007年05月22日 12時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響應 在 2007年05月22日 12時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>您提供的身份驗證信息有誤,不能正常訪問此服務!</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
再看看在設置了SoapHeader之後的Soap的請求和響應信息
以下是引用片段:
-----Soap請求 在 2007年05月22日 12時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響應 在 2007年05月22日 12時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>
點正是通過這個節點,SoapMessage將信息傳遞給了網絡服務端,網絡服務端便可以從中解析出來,並加以處理,從上面的SoapMessage中,我們也看出,用戶名和密碼是以明文的格式傳輸的,這樣,SoapHeader就更像Http協議中的Cookie了,我們可以參考CookIE的使用,來擴展SoapHeader,讓它變得更加安全些,但總的看來,通過直接設置SoapHeader的方法提高安全性還是有一定限制的。在安全不是特別重要的應用情形中,推薦采用此種解決方案,因為它方便快捷,靈活易用。
下一節,我將介紹一下,如何獲取SoapMessage.