ASP.NET Core利用攔截器 IActionFilter實現權限控制


麥荻網教系統”采用了前后端代碼分離的架構,即“Miidy.Cloud.Console”站與“Miidy.Cloud.Manage”站(兩個前端站)同時通過web api的方式調用“Miidy.Cloud.RestWeb” web服務,以達到前后端代碼分離的方式(詳情請查看麥荻網教系統的安裝部署文檔)。因為“Miidy.Cloud.Manage”站只開放給具備管理權限的用戶,故除了在前端增加控制外,還需在“Miidy.Cloud.RestWeb” web服務內進行權限控制。那么,如何在“Miidy.Cloud.RestWeb” web服務內根據用戶實現權限控制呢?

 

IActionFilter

在“Miidy.Cloud.RestWeb”程序內,我們將借助IActionFilter接口來實現請求的攔截。該接口提供了兩個方法(官網文檔)分別為:OnActionExecuted(Action執行后)、OnActionExecuting(Action執行前)。根據需求,我們實現OnActionExecuting即可。

 

Attribute

我們再借助“Attribute”屬性特性,可幫助我們在“Miidy.Cloud.RestWeb”指定的方法內按需使用攔截器,這樣便可很方便的達到權限控制的目的。

 

實現

如上面所述,我們已經清楚了整個實現思路,那么下面就來看看“Miidy.Cloud.RestWeb”程序攔截器的代碼實現吧:

1、首先我們先創建一個名為“ManageVerifyAttribute”的攔截器類,命名以“Attribute”結尾,並繼承“Attribute”類,與實現“IActionFilter”。並在OnActionExecuting方法內寫入業務代碼。具體代碼如下:

  1 
  2 namespace Miidy.Cloud.Provider
  3 {
  4     /// <summary>
  5     /// 該過慮器提供給所有對外的RestApi接口使用
  6     /// 在有需要驗證每個接口/方法是否只為管理人員用戶調用時使用
  7     /// 方法級別的過率器
  8     /// </summary>
  9     public class ManageVerifyAttribute : Attribute, IActionFilter
 10     {
 11         public void OnActionExecuted(ActionExecutedContext context)
 12         {
 13         }
 14 
 15         /// <summary>
 16         /// 判斷用戶是否為管理角色,不是則拋出異常
 17         /// </summary>
 18         /// <param name="context"></param>
 19         public void OnActionExecuting(ActionExecutingContext context)
 20         {
 21             if (context.HttpContext.User.Identity.IsAuthenticated)
 22             {
 23                 var roleType = int.Parse(context.HttpContext.User.Claims.First(c => c.Type == "roleType").Value);
 24                 //不是管理人員
 25                 if (roleType <= 0 || roleType >= 4)
 26                 {
 27                     context.Result = new JsonResult(new Result(214));
 28                 }
 29             }
 30             else
 31                 context.Result = new JsonResult(new Result(214));
 32         }
 33 
 34     }
 35 }
 36 

 

2、在Web Api的方法內打上[ManageVerify]屬性,即可完成攔截器的功能實現了,具體如下:

  1 
  2 /// <summary>
  3 /// 同步單個數據,數據不存在則增加,否則修改
  4 /// </summary>
  5 /// <param name="ids"></param>
  6 /// <returns></returns>
  7 [Route("SynchrDataByModel")]
  8 [HttpPost]
  9 [ManageVerify]
 10 public async Task<Result> SynchrDataByModel(MC_Ware model)
 11 {
 12     var resul = await _WareCore.SynchrDataAsync(new List<MC_Ware> { model });
 13     if (resul <= 0)
 14         return new Result(211);
 15     return new Result(200);
 16 }

 

 

總結

1、基於“IActionFilter”接口來實現請求的攔截。

2、基於“Attribute”屬性特性可幫助我們可以按需在指定WebApi方法內使用攔截器。

 

聲明

本文為作者原創,轉載請備注出處與保留原文地址,謝謝。如文章能給您帶來幫助,請點下推薦或關注,感謝您的支持!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM