WCF Data Service,ASP.NET
在開發WCF Data Service的時候,筆者一直在想一個問題,就是安全性的問題!如何限制哪些IP可以存取這個WCF Data Service,不然任何人都可以呼叫也很奇怪。當然方法其實有很多,也可以使用Windows整合驗證並使用Web.config來設定Role,但是筆者想的是像一般網站一樣,透過系統管理者在自行開發的程式上設定阻擋IP,限制這個WCF Data Service可以使用的IP位址。
要實作這樣的功能必須在WCF Data Service提供服務之前攔下來並檢查用戶端的IP是否符合要求。這時可以複寫DataService的OnStartProcessingRequest()方法,並且要複寫HandleException()方法將HandleExceptionArgs的UseVerboseErrors設定為true,表示要對用戶端回應詳細錯誤訊息,這樣才能使我們throw的錯誤訊息可以回傳至用戶端。
筆者先使用最簡單的方式在OnStartProcessingRequest內以HttpContext.Current.Request.UserHostAddress 取得用戶端的IP。
程式碼非常的簡單,如下:
1: using System;
2: using System.Data.Services;
3: using System.Data.Services.Common;
4: using System.Collections.Generic;
5: using System.Linq;
6: using System.ServiceModel.Web;
7: using System.Data.Objects;
8: using NorthwindModel;
9: using System.ServiceModel;
10: using System.Web;
11:
12: public class WcfSPDataService :
13: DataService<NorthwindEntities>
14: {
15: // 只呼叫一次方法初始化全服務原則。
16: public static void InitializeService(DataServiceConfiguration config)
17: {
18: // TODO: 設定規則,指出哪些實體集及服務作業可見、可更新等等。
19: // 範例:
20: config.SetEntitySetAccessRule("Orders", EntitySetRights.AllRead);
21: config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
22: config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
23: }
24: protected override void HandleException(HandleExceptionArgs args)
25: {
26: args.UseVerboseErrors = true;
27: base.HandleException(args);
28: }
29: protected override void OnStartProcessingRequest(ProcessRequestArgs args)
30: {
31: string ipAddress = HttpContext.Current.Request.UserHostAddress;
32: NorthwindEntities entity = new NorthwindEntities();
33: var result = (from s1 in entity.BlockIPAddress
34: where s1.IPAddress==ipAddress select s1).Count();
35:
36: if(result>0)
37: throw new System.Exception("您的用戶端IP:" + ipAddress + " Address不被允許!.");
38:
39: base.OnStartProcessingRequest(args);
40: }
41: }
為了準確性筆者將成是佈署至IIS後再執行,從其他台電腦執行結果是可以正常的執行,不會有錯誤,如下:
當IP Addres如果是被阻擋的,在IE即會出現錯誤訊息,如下:
讀者會發現,錯誤訊息中的IP怎與URL中的相同?因為筆者故意將BlockIPAddress 資料表中設定與筆者local相同的IP位址,192.168.1.27下對應到的也是筆者的IIS伺服器。
OK, 簡單的應用,各位參考看看!
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^