身為大量簡訊發送平台的開發廠商,我們不僅只提供簡訊發送服務,也提供可建置在客戶環境裡的完整解決方案,而這也代表著我們必須配合客戶需求進行簡訊系統的客製化,最常見的客製化就是配合客戶環境的單一登入機制(Single Sign On)進行身分驗證或是授權的修改。
詮力的最新的簡訊發送平台採用ASP.NET MVC開發,而這次遇到的難題是客戶要求即使使用者已通過身分驗證(登入成功),每一次的Web Request都要再與身分識別服務的主機進行驗證。
查詢了一下現有MVC的解決方案,不外乎1.使用Base Controller與身分識別服務的主機進行驗證,再讓所有的Controller套用此Base Controller。或是2.客製化Action Filter,再讓所有的Controller套用此Filter。本篇文章採用方法二,來討論一下MVC網站如何客製化Action Filter。(註:純Web API的網站若要客製化Action Filter,細節會與本篇略有不同喔)
首先簡介一下ASP.NET MVC 各類型的Filter(篩選條件):
1.Authentication Filter驗證篩選條件(MVC 5新增加的類型) ,用於執行驗證而做出是否執行動作方法的安全性決策。
- Authorization Filter授權篩選條件,用於執行授權而做出是否執行動作方法的安全性決策。
- Action Filter動作篩選條件,其中包裝了動作方法的執行。 此篩選條件可以執行額外的處理,例如提供額外的資料給動作方法、檢查傳回值,或取消執行動作方法。
- Result Filter結果篩選條件,其中包裝了 ActionResult 物件的執行。 此篩選條件可以執行額外的結果處理,例如修改 HTTP 回應。
- Exception Filter例外狀況篩選條件,動作方法中的某處擲回未處理的例外狀況時便會執行,以授權篩選條件開始,並且以執行結果做為結束。 例外狀況篩選條件可以用於記錄或顯示錯誤頁面這類工作。
接下來會使用Action filter(動作篩選條件),來說明MVC網站如何套用filter。
1.在MVC網站裡建立Filters資料夾,並在資料夾裡加入類別,例如MyFilter。(註:很重要的一點是此類別不能放在App_Code資料夾裡,否則在Controller裡會找不到此客製化的Filter)
- MyFilter類別繼承ActionFilterAttribute, IActionFilter,並覆寫OnActionExecuting方法。(還有OnActionExecuted等事件,依需求選擇要覆寫的事件)
- 在Controller或Action套用MyFilter屬性。
4.若不想一個一個Controller或Action套用MyFilter Attribute,另一個做法是在App_Start資料夾下的FilterConfig.cs裡加入filters.Add(new MyFilter());
驗證方法:可在MyFilter.cs裡覆寫的方法裡加入Log紀錄RouteData。
6.最後驗證結果如下圖。
結論:Filter幫助MVC網站做Log、驗證授權、例外處理等動作時,有個屬性可輕鬆套用在整個網站、個別Controller、或個別Action上,所以學會Filter的開發是很重要的。搜尋資料的過程中,還發現有人拿Action Filter作客製化的效能指標,可在效能監視器裡使用,也是很有趣的應用喔,見參考資料4。
參考資料:
- NET MVC 4 Custom Action Filters ─ http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-custom-action-filters
- NET MVC 應用程式中的動作篩選 ─ https://msdn.microsoft.com/zh-tw/library/dd410209.aspx
- Understanding Action Filters ─ http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs
- Building Performance Metrics into ASP.NET MVC Applications ─ https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/