【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码
微信公眾號:趣編程ACE
關(guān)注可了解更多.NET日常開發(fā)技巧,如需源碼,請公眾號留言 源碼;
JWT+ActionFilter 簡便控制器代碼
這是微軟關(guān)于過濾器的介紹:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0
今天的日常開發(fā)技巧是介紹下如何通過Authorization 和 Action Filter 來自動將登錄用戶的ID添加到控制器中去,這樣就可以簡化我們代碼量了。
首先我們新建一個ApiController類繼承ControllerBase ?
1????[ApiController] 2????[Route("api/[controller]")] 3????[Authorize]???//?開啟授權(quán)?登錄成功后才能訪問 4????[ActionFilter]?//?自定義的一個屬性?核心功能下文實(shí)現(xiàn)?用來實(shí)現(xiàn)自動將登錄用戶的ID添加到控制器中去 5????public?abstract?class?ApiController:ControllerBase 6????{ 7????????public?string?UserId?{?get;?set;?} 8????}上述代碼我們創(chuàng)建一個抽象的基類控制器,這樣就可以將[ActionFilter]應(yīng)用到所有繼承ApiController這個基類的控制器上,這樣我們就可以規(guī)避很多重復(fù)的代碼,與此同時我們定義一個UserId屬性,便于每個派生類訪問。
[Authorize]用來判斷是否有權(quán)限調(diào)用控制器或者動作方法,常見的身份認(rèn)證方案有JWT,下文代碼也是基于此。
下面我們實(shí)現(xiàn)ActionFilter 屬性
在這個類中,我們繼承了Attribute ,這樣就可以將ActionFilter當(dāng)做屬性來用,同時繼承了IActionFilter接口,這就要求我們實(shí)現(xiàn)兩個方法:OnActionExecuted 、 OnActionExecuting 兩個方法的執(zhí)行順序分別是控制器(動作方法)被執(zhí)行后和執(zhí)行前。因?yàn)槲覀冃枰谒械目刂破骼锩媸褂肬serId, 所以我們在OnActionExecuting 執(zhí)行相應(yīng)的邏輯操作。
ActionExecutedContext 作為一個OnActionExecuting方法的參數(shù),可以得到控制器本身,我們將控制器轉(zhuǎn)化為 ApiController ?也就是上文定義的那個抽象類,這樣就可以操作里面定義的UserId 了。因?yàn)槲矣玫腏WT驗(yàn)證,所以第二行的邏輯可以獲取到登錄用的UserId。對于ClaimTypes.NameIdentifier 這個屬性 可以在生成Toke的時候用登錄用戶的UserId賦值,這樣就可以作為有效信息存到Token中去便于解析。
示例展示
1????///?<summary>2????///?測試控制器??繼承自定義的ApiController3????///?</summary>4????public?class?TestController?:?ApiController5????{6????????[HttpGet]7????????public?void?GetUserId()8????????{9????????????//?直接獲取到用戶訪問的用戶Id? 10????????????//?后續(xù)需要UserId傳參調(diào)用服務(wù)的時候就不需要重新獲取了用戶Id了 11????????????System.Console.WriteLine("用戶Id:"+UserId);?//?控制臺可以打印出?訪問登錄用戶的UserId 12????????} 13????}總結(jié)
以上是生活随笔為你收集整理的【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移除指定 global using 命名
- 下一篇: 一点杂感 以及 java8 Stream