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