在項目開發,我們經常會使用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來驗證連接配接是否成功。當然了,為了儲存使用者名與密碼等的安全,可以對其進行加密等手段來保證其安全。
以下是主要源代碼:

1
/// <summary>
2
/// 伺服器網絡憑證
3
/// </summary>
4
/// <returns></returns>
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
/// <param name="url">伺服器WebService URL</param>
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
50
51
52
53
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 陳輝聰 [email protected]
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();