本文僅提供通過設置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調用這種方式還是一種不錯的選擇