如何限制WCF Data Service存取的用戶端IP

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/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^