文章出處

回到目錄

關于Lind.DDD框架里API框架的技術點說明

講解:張占嶺

花名:倉儲大叔

主要框架:Lind.DDD

目錄

  1. 關于Lind.DDD.Authorization
  2. 關于授權的原理
  3. 關于ApiValidateModelConfig
  4. 關于Lind.DDD.CacheConfigFile
  5. 如何為你的API項目注入授權模塊
  6. 關于服務端收取過濾器ApiValiadateFilter
  7. 如何在客戶端生產加密授權串
  8. 關于請求類與響應類
  9. 客戶端如何做分頁

 

關于Lind.DDD.Authorization

Lind.DDD為我們提交了強大的API校驗組件,只需要在全局或者要授權的controller上添加對應的過濾器即可完成授權的過程,這樣,你的API就安全多了。

關于授權的原理

客戶端在向API服務端獲取數據時,需要先申請一個appkey作為自己的標識,當然這也是雙方約定的,我們可以叫做公鑰,而真正做數據校驗的不是它,它只是一個唯一標識,對外公開,真正做數據加密的叫passKey它是保存在雙方內部的,不對外公開所以叫密鑰,在客戶端向API服務端通訊時,需要將這個passKey連同參數和appkey傳到服務端,由服務端做相同的校驗碼生產邏輯,最后兩者進行比較,相同即驗證通過。

 

關于ApiValidateModelConfig

ApiValidateModelConfig主要在服務端存儲所有被收取的客戶端的信息,它是一個列表集合,由AppKey,AppName,PassKey,ExpireDate等元素組成,它們具體的含義如下:

 

而這個實體在服務端校驗時,會從配置文件XML中反射出來,以遍進行比較,當然,你的配置文件如果沒有修改,它會直接從內存里進行獲取,這個邏輯由CacheConfig控制。

關于Lind.DDD.CacheConfigFile

它在早期的大叔框架里就已經出來了,主要用于做配置文件緩存的,當緩存文件被修改后,它的信息將重新被加載,否則將從內在中來進行獲取,這個文件需要管理員在服務端進行維護,在添加和刪除配置時,需要做修改,當然,我們也完全可以把它持久化到其它數據庫里,如sqlserver,redis等介質。

 

如何為你的API項目注入授權模塊

API項目注入授權功能很是容易,直接在對應的controller上添加過濾器Lind.DDD.Authorization.Api.ApiValiadateFilter即可。

 

或者在Global.asax里添加全局的過濾,也是可以的,值得注意的是,如果你添加的是全局過濾器,如果希望有一些Controller不被授權,即可以被匿名訪問,那你也只需要為指定的控制器添加AllowAnonymous特性即可。

 

關于服務端收取過濾器ApiValiadateFilter

ApiValiadateFilter是服務端的收取核心組件,它會攔截指定的api控制器,然后進行授權檢查,如果沒有被標示AllowAnonymous,它將會進行校驗,具體就是將請求參數進行排序,組件,并連同passkey(由客戶端傳來的appKey進行查詢,得到的ApiValidateModel實體)生成新的MD5加密串,與客戶端傳過來的密鑰進行對比,匹配即有效,否則返回403無權訪問,最新的api校驗的新功能如下:

一、統一校驗模塊

二、統一參數組合的生成

三、UTC時間戳的引入,參數有效性校驗(1小時有效)

四、雙方約定的密鑰,請求的防偽造

如何在客戶端生產加密授權串

Lind.DDD框架為我們提供了生成請求密鑰的方法,你需要做的只是將所有參數添加到字典,然后調用對應的方法即可,這對于.net開發人員來說,絕對是個福音!

 

關于請求類與響應類

API服務端與客戶端約定了請求與響應的模型,它們都是抽象類,提供最基礎的功能,下面簡單說一下:

l 請求對象

對應于DTO請求類,它繼承自抽象類RequestBase,它提供了傳輸標示,分頁,排序,篩選字段等功能。

 

l 響應對象

對應于DTO響應類,它繼承自抽象類ResponseBase,它提供了RequestBase里的傳輸標示,標明了是否為同一個請求,響應的字段等。

 

l 響應返回對象

對應于DTO的返回結果,它由密封類ResponseMessage提供,返回它的實例即可,它會提供返回狀態碼,唯一標識,返回對象,錯誤碼和錯誤信息等。

 

客戶端如何做分頁

分頁對于每個項目來說都是必要的,對于面向服務的API來說了是必須的,我們Lind.DDD對分頁一定進行了封裝,在這里為大家簡單說一下。

統一的DTO請求基類RequestBase,它主要實現請求方調用時的字段過濾(ContainFields),分頁控制(Page),傳輸標示(GuidKey),按字段排序時(Sort),請求方只需要傳輸相應的參數即可,代碼如下:

 

在服務端進行分頁方法實現時,返回統一的Lind.DDD.Paging.PagedList<T>對象,而在業務方法處理時,只需要調用請求類的GetPageParameters()方法即可拿到客戶端傳來的分頁對象,而從數據庫查出來的對象也可以使用MapToPage<T>()這個方法來映射成指的DTO對象,代碼如下:

 

感謝各位對Lind.DDD框架的關注,讓我們一起把框架做的更好!

感謝各位!

回到目錄


文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()