回到目錄html
關於Lind.DDD框架裏API框架的技術點說明redis
講解:張佔嶺sql
花名:倉儲大叔數據庫
主要框架:Lind.DDDapi
Lind.DDD爲咱們提交了強大的API校驗組件,只須要在全局或者要受權的controller上添加對應的過濾器便可完成受權的過程,這樣,你的API就安全多了。數組
客戶端在向API服務端獲取數據時,須要先申請一個appkey做爲本身的標識,固然這也是雙方約定的,咱們能夠叫作公鑰,而真正作數據校驗的不是它,它只是一個惟一標識,對外公開,真正作數據加密的叫passKey,它是保存在雙方內部的,不對外公開,因此叫密鑰,在客戶端向API服務端通信時,須要將這個passKey連同參數和appkey傳到服務端,由服務端作相同的校驗碼生產邏輯,最後二者進行比較,相同即驗證經過。緩存
ApiValidateModelConfig主要在服務端存儲全部被收取的客戶端的信息,它是一個列表集合,由AppKey,AppName,PassKey,ExpireDate等元素組成,它們具體的含義以下:安全
而這個實體在服務端校驗時,會從配置文件XML中反射出來,以遍進行比較,固然,你的配置文件若是沒有修改,它會直接從內存裏進行獲取,這個邏輯由CacheConfig控制。app
它在早期的大叔框架裏就已經出來了,主要用於作配置文件緩存的,當緩存文件被修改後,它的信息將從新被加載,不然將從內在中來進行獲取,這個文件須要管理員在服務端進行維護,在添加和刪除配置時,須要作修改,固然,咱們也徹底能夠把它持久化到其它數據庫裏,如sqlserver,redis等介質。框架
爲API項目注入受權功能非常容易,直接在對應的controller上添加過濾器Lind.DDD.Authorization.Api.ApiValiadateFilter便可。
或者在Global.asax裏添加全局的過濾,也是能夠的,值得注意的是,若是你添加的是全局過濾器,若是但願有一些Controller不被受權,便可以被匿名訪問,那你也只須要爲指定的控制器添加AllowAnonymous特性便可。
ApiValiadateFilter是服務端的收取核心組件,它會攔截指定的api控制器,而後進行受權檢查,若是沒有被標示AllowAnonymous,它將會進行校驗,具體就是將請求參數進行排序,組件,並連同passkey(由客戶端傳來的appKey進行查詢,獲得的ApiValidateModel實體)生成新的MD5加密串,與客戶端傳過來的密鑰進行對比,匹配即有效,不然返回403無權訪問,最新的api校驗的新功能以下:
1、統一校驗模塊
2、統一參數組合的生成
3、UTC時間戳的引入,參數有效性校驗(1小時有效)
4、雙方約定的密鑰,請求的防僞造
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框架的關注,讓咱們一塊兒把框架作的更好!
感謝各位!