本文僅提供通過設定SoapHeader來控制非法使用者對WebService的呼叫,如果是WebService建議使用WSE3.0來保護Web服務,如果使用的是Viaual Studio 2008可以使用WCF,WCF裡面提供了更多的服務認證方法。以下提供一種基於SoapHeader的自定義驗證方式。
1.首先要自定義SoapHeader,須繼承System.Web.Services.Protocols.SoapHeader 。
using System; using System.Collections.Generic; using System.Web; /// <summary> ///自定義的SoapHeader /// </summary> public class MySoapHeader : System.Web.Services.Protocols.SoapHeader { private string userName=string.Empty; private string passWord=string.Empty; /// <summary> /// 建構函式 /// </summary> public MySoapHeader() { } /// <summary> /// 建構函式 /// </summary> /// <param name="userName">使用者名稱</param> /// <param name="passWord">密碼</param> public MySoapHeader(string userName, string passWord) { this.userName = userName; this.passWord = passWord; } /// <summary> /// 獲取或設定使用者使用者名稱 /// </summary> public string UserName { get { return userName; } set { userName = value; } } /// <summary> /// 獲取或設定使用者密碼 /// </summary> public string PassWord { get { return passWord; } set { passWord = value; } } }
2.新增WebService,並編寫相應程式碼。
using System; using System.Collections.Generic; using System.Web; using System.Web.Services; /// <summary> ///WebService 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class WebService : System.Web.Services.WebService { //宣告Soap頭例項 public MySoapHeader myHeader=new MySoapHeader(); [System.Web.Services.Protocols.SoapHeader("myHeader")] [WebMethod] public string HelloWord() { //可以通過儲存在資料庫中的使用者與密碼來驗證 if (myHeader.UserName.Equals("houlei")&myHeader.PassWord.Equals("houlei")) { return "呼叫服務成功!"; } else { return "對不起,您沒有許可權呼叫此服務!"; } } }
3.客戶端呼叫,分別使用不設定SoapHeader與設定SoapHeader。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace App { class Program { static void Main(string[] args) { localhost.WebService service = new localhost.WebService(); //沒有設定SoapHeader的服務呼叫 Console.WriteLine("沒有設定SoapHeader:" + service.HelloWord()); Console.WriteLine(); //將使用者名稱與密碼存入SoapHeader; localhost.MySoapHeader header = new localhost.MySoapHeader(); header.UserName = "houlei"; header.PassWord = "houlei"; service.MySoapHeaderValue = header; //設定SoapHeader的服務呼叫 Console.WriteLine("設定SoapHeader:" + service.HelloWord()); Console.Read(); } } }
4.執行應用程式,檢視執行結果。
再看一下直接通過瀏覽器的呼叫結果。
點選HelloWord呼叫Web服務,結果如下:
點選“呼叫”按鈕,得到從伺服器返回撥用結果。
新增自定義SoapHeader可以成功呼叫WebService,否則不能呼叫WebService,從而實現對Web Service的非法呼叫。這種方法存在一定的弊端,就是在每一個WebService方法上都要進行一下驗證,如果使用者名稱與密碼儲存在資料庫中,每呼叫一次WebService都要訪問一次資料庫進行使用者名稱與密碼的驗證,對於頻繁呼叫WebService來說,資料庫壓力很大。然而少量WebService呼叫這種方式還是一種不錯的選擇。
(作者:侯壘)