轉自:http://www.anqn.com/dev/vc/2010-01-23/a09122769.shtml
?
????? 在項目開發,我們經常會使用WebService,但在使用WebService時我們經常會考慮以下問題:怎么防止別人訪問我的WebService?從哪里引用我的WebService?對于第一個問題,就涉及到了WebService是安全問題,因為我們提供的WebService不是允許所有人能引用的,可能只允許本公司或者是通過授權的人才能使用的。那怎么防止非法用戶訪問呢?很容易想到通過一組用戶名與密碼來防止非法用戶的調用 。
在System.Net中提供了一個NetworkCredential,通過它我們可以在網絡中提供一個憑證,只有獲得該憑證的用戶才能訪問相應的服務的權限。在這里我們也使用NetworkCredential。在NetworkCredential中,我們通過提供WebService發布所在的服務器名稱,以及登錄服務器并調用該WebService的用戶名及密碼(在IIS中配置)。
在調用WebService時設置其Credential屬性,把上面得到的Credential憑證賦值給它,這樣只有使用提供的用戶名及密碼才能調用WebService服務了而其他用戶則無法訪問,這樣就能能滿足防止WebService被別人調用了。
至于主機名,用戶名及密碼,對于B/S可以通過webconfig來配置,對于C/S可以使用應用程序配置文件。這樣就能靈活地配置了。
如下以C/S為例來說明,首先我們提供一個服務器網絡憑證,然后通過WebRequest來驗證連接是否成功。當然了,為了保存用戶名與密碼等的安全,可以對其進行加密等手段來保證其安全。
以下是主要源代碼:
Code
1?/**? 2?///?服務器網絡憑證 3?///? 4?///? 5?public?static?NetworkCredential?MyCred() 6?{ 7?string?loginUser?=?Properties.Settings.Default.UserName;//用戶名 8?string?loginPSW?=?Properties.Settings.Default.UserPSW;//密碼 9?string?loginHost?=?Properties.Settings.Default.HostName;//主機名,可以是IP地址,也可以服務器名稱 10?NetworkCredential?myCred?=?new?NetworkCredential(loginUser,loginPSW,?loginHost); 11?//NetworkCredential?myCred?=?new?NetworkCredential("username",?"123456",?"yourip");//"username",?"123456",?"yourservername" 12?return?myCred; 13?} 14?/**? 15?///?驗證是否成功連接到服務器,若連接成功,則返回TRUE 16?///? 17?///?服務器WebService?URL 18?///? 19?public?static?bool?Credential(string?url) 20?{ 21?//定義局部變量 22?string?url?=?G_Url;//2009-02-25?陳輝聰?服務器驗證只驗證到機器 23 24?try 25?{ 26?if?(myWebResponse?==?null) 27?{ 28?WebRequest?myWebRequest?=?WebRequest.Create(url);//根據URL創建一個連接請求 29?myWebRequest.Credentials?=?MyCred();//獲取驗證的憑證,這是最重要的一句 30?myWebRequest.Timeout?=?20000;//單位為毫秒 31 32?myWebResponse?=?myWebRequest.GetResponse();//返回連接成功時的信息 33?} 34?} 35?catch?(WebException?wex)//無法連接到服務器,可能是因為服務器錯誤或用戶名與密碼錯誤 36?{ 37?if?(myWebResponse?!=?null)//毀銷 38?{ 39?myWebResponse.Close(); 40?myWebResponse?=?null; 41?} 42 43?return?false; 44?} 45?catch?(Exception?ex) 46?{ 47?if?(myWebResponse?!=?null) 48?{ 49?myWebResponse.Close(); 50?myWebResponse?=?null; 51?} 52 53?return?false; 54 55?} 56?finally 57?{ 58?} 59 60?return?true; 61?} 62 63?private?static?WS_Webasic.WS_Webasic?webasic?=null;//實現華WS_Webasic.WS_Webasic 64 65?/**? 66?///?WS_Webasic初始化 67?///? 68?public?static?WS_Webasic.WS_Webasic?WS_Webasic 69?{ 70?get 71?{ 72?if?(webasic?==?null)//若webasic?為空,則重新實例化,這樣可以減少驗證的時間,提高效率 73?{ 74?//webasic?=?new?ZEDI.WS_Webasic.WS_Webasic(); 75?//wsBool?=?Credential(webasic.Url);//URL改為服務器地址?2009-02-25?陳輝聰?chhuic@163.com 76?wsBool?=?Credential(G_Url); 77?if?(wsBool?==?true)?//服務器連接驗證通過 78?{ 79?webasic?=?new?WS_Webasic.WS_Webasic();//實例化 80?webasic.Credentials?=?MyCred();//得到服務器連接憑證,這樣該WebService可以放心的連接了 81?} 82?} 83?return?webasic; 84?} 85?} |
注:
(1)必須引用 System.Net;
(2)對WebService發訪問,在IIS里取消匿名訪問權限,若允許匿名訪問,就沒有必須提供驗證憑證了。IIS里怎么取消匿名訪問 權限請參照IIS相關文章,這里不在累贅。
驗證是有時速度會比較慢,主要是因為myWebResponse = myWebRequest.GetResponse();時速度比較慢,若有更好的方法驗證網絡連接是否成功的話,請告訴我,呵呵。。。
通過以上的實現,就實現了WebService的安全訪問問題,若還有更好的方法,不吝賜教
?