我正在用.NET Core Web API構建REST API。將授權放入服務層而不是Web API層
我控制器簡單地請求轉發到服務層,現在返回的結果
[HttpPost(nameof(Create))]
public async Task<Response<ProviderDTO>> Create([FromBody] ProviderDTO provider)
=> await providerService.CreateAsync(provider);
我在系統的地步,我要開始實施授權。
.NET Core有a lot of options來實現授權,但文檔主要在Web層(控制器明顯存在的地方)的上下文中討論這些方法。
我的直覺告訴我,我需要在服務層本身實現授權,而不是將此授權放在Web層上。
我的一些理由包括:
- 服務層可以通過比控制器以外的東西被調用(例如,服務調用其他服務,這將在不經授權點關注) 。
- 服務授權可以直接進行單元測試,而不必依賴爲服務前面的每個「層」編寫的集成測試。
- 保存對數據庫的多個調用 - 如果我需要在授權要求中授權文檔(如果它通過),則必須稍後在服務中提取同一文檔。
問題一
難道是一個明智的做法注入IPrincipal
和IAuthorizationService
到我的服務,並在那裏直接處理授權?然後,網絡層將純粹只是檢查用戶登錄,也許有些基於簡單的策略屬性(即該控制器只允許例如工作人員的政策)
問題二
沒有人有任何的資源,他們可以通過鏈接我(我做了調查,但沒有太多的在那裏對這個)
PS:關於在服務層拒絕請求,我有一個異常處理中間件,它的自定義異常轉換成HTTP響應。因此,如果出現未經授權的請求,我會被拋出一些對未經授權的例外,這將最終導致一個HTTP的403