【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码

微信公众号:趣编程ACE
关注可了解更多.NET日常开发技巧,如需源码,请公众号留言 源码;

JWT+ActionFilter 简便控制器代码

这是微软关于过滤器的介绍:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0

今天的日常开发技巧是介绍下如何通过Authorization 和 Action Filter 来自动将登录用户的ID添加到控制器中去,这样就可以简化我们代码量了。

首先我们新建一个ApiController类继承ControllerBase  

1    [ApiController]
2    [Route("api/[controller]")]
3    [Authorize]   // 开启授权 登录成功后才能访问
4    [ActionFilter] // 自定义的一个属性 核心功能下文实现 用来实现自动将登录用户的ID添加到控制器中去
5    public abstract class ApiController:ControllerBase
6    {
7        public string UserId { get; set; }
8    }

上述代码我们创建一个抽象的基类控制器,这样就可以将[ActionFilter]应用到所有继承ApiController这个基类的控制器上,这样我们就可以规避很多重复的代码,与此同时我们定义一个UserId属性,便于每个派生类访问。

[Authorize]用来判断是否有权限调用控制器或者动作方法,常见的身份认证方案有JWT,下文代码也是基于此。
下面我们实现ActionFilter 属性

1public class ActionFilter : Attribute, IActionFilter2    {3        // 动作方法执行结束调用4        public void OnActionExecuted(ActionExecutedContext context)5        {6            // throw new NotImplementedException();7        }8        // 动作方法执行前执行9        public void OnActionExecuting(ActionExecutingContext context)
10        {
11            // throw new NotImplementedException();
12            var c = context.Controller as ApiController;
13            c.UserId = c.User.FindFirstValue(ClaimTypes.NameIdentifier);
14        }
15    }

在这个类中,我们继承了Attribute ,这样就可以将ActionFilter当做属性来用,同时继承了IActionFilter接口,这就要求我们实现两个方法:OnActionExecutedOnActionExecuting 两个方法的执行顺序分别是控制器(动作方法)被执行后和执行前。因为我们需要在所有的控制器里面使用UserId, 所以我们在OnActionExecuting 执行相应的逻辑操作。
ActionExecutedContext 作为一个OnActionExecuting方法的参数,可以得到控制器本身,我们将控制器转化为 ApiController  也就是上文定义的那个抽象类,这样就可以操作里面定义的UserId 了。因为我用的JWT验证,所以第二行的逻辑可以获取到登录用的UserId。对于ClaimTypes.NameIdentifier 这个属性 可以在生成Toke的时候用登录用户的UserId赋值,这样就可以作为有效信息存到Token中去便于解析。

1public static string CreateToken(JwtTokenModel tokenModel)2{3            var claims= new []{4                new Claim("Id",tokenModel.Id.ToString()),5                new Claim("CustomerNo",tokenModel.CustomerNo),6                new Claim("CustomerName",tokenModel.CustomerName),7                new Claim(ClaimTypes.NameIdentifier,tokenModel.CustomerNo) // ClaimTypes.NameIdentifier类型值为用户Id8            };9            // 生成密钥
10            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenModel.Security));
11            var creds = new SigningCredentials(key,SecurityAlgorithms.HmacSha256); 
12
13            var token =new JwtSecurityToken(
14                issuer:tokenModel.Issuer,
15                audience:tokenModel.Audience,
16                expires:DateTime.Now.AddDays(tokenModel.Expires),
17                signingCredentials:creds,
18                claims:claims
19            );
20
21            //生成token
22            var accessToken =new JwtSecurityTokenHandler().WriteToken(token);
23            return accessToken;
24}

示例展示

1    /// <summary>2    /// 测试控制器  继承自定义的ApiController3    /// </summary>4    public class TestController : ApiController5    {6        [HttpGet]7        public void GetUserId()8        {9            // 直接获取到用户访问的用户Id 
10            // 后续需要UserId传参调用服务的时候就不需要重新获取了用户Id了
11            System.Console.WriteLine("用户Id:"+UserId); // 控制台可以打印出 访问登录用户的UserId
12        }
13    }

3a5b68a254b9f2819e570465c1e903cc.png

3edf9e55f0b87333d77aaa545c9e2932.png

3511ca1363ce53de2e2e6bfcc466ff9e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在P2P市场中代替“看不见的手”的算法在哪里

◆ ◆ ◆ 本文简单探讨P2P市场机制&#xff0c;在此基础上探讨匹配撮合服务的可能性。 ◆ ◆ ◆ P2P市场机制基本定义与假设 首先&#xff0c;我们回顾一些基本定义与假设。P2P市场为“网络借贷是指个体和个体之间通过互联网平台实现的直接借贷。”[2]利率决定一般是平台决定借…

Android之adb jdwp获取debug版本app的进程Id

1、adb jdwp命令 adb jdwp获取debug版本app的进程Id 2、用途 带我们运行一个debug版本的app时候&#xff0c;我们需要过滤日志&#xff0c;我们一般采取这种办法 adb shell ps | grep package 得到进程ID,然后 adb logcat | grep pid 打印日志&#xff0c;有了adb jdwp&…

NPOI格式设置1

using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; //创建Execl IWorkbook hssfworkbook new HSSFWorkbook(); //创建一个Sheet hssfworkbook.CreateSheet("Sheet1"); //HSSFWorkbook实例写入文件 FileStream file new FileStream("test.xls", F…

软件配置管理(五)常用重构技巧

文章目录一、重新组织函数1.提炼函数2.内联函数3.内联临时变量4.以查询取代临时变量5.引入解释性变量6.分解临时变量7.移除对参数的赋值8.以函数对象取代函数9.替换算法二、在对象之间搬移特性1.搬移函数2.搬移字段3.提炼类4.将类内联化5.隐藏“委托关系”6.移除中间人7.引入外…

关于他们回答的 怎样在桌面建一个python GUI的快捷方式 这个问题

在之前的2个随笔里面&#xff0c;有写过《找到可以解决问题的正确的人》、《如何提问》&#xff0c;说白了就是您需要帮助的时候&#xff0c;您得让对方100%懂你&#xff0c;否则没戏。 那么最近看到这样1个古老的问题&#xff0c;和一些没有答到"点儿"上的回答&…

Android之最简单和靠谱的监听Home键和菜单键(最近任务栏)

1、介绍ACTION_CLOSE_SYSTEM_DIALOGS /*** Broadcast Action: This is broadcast when a user action should request a* temporary system dialog to dismiss. Some examples of temporary system* dialogs are the notification window-shade and the recent tasks dialog.*…

.NET Core中行为过滤器ActionFilterAttribute的使用介绍

什么是行为过滤器&#xff1f;行为过滤器是你可以应用到一个控制器行为的&#xff0c;或者整个控制器的&#xff0c;来修改控制器行为的执行方式的属性。当请求进入 API 接口的时候&#xff0c;操作过滤器提供了一个进入之前&#xff08;before&#xff09;和进入之后&#xff…

基本线程同步(三)在同步的类里安排独立属性

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第二章&#xff0c;作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;许巧辉 校对&#xff1a;方腾飞 在同步的类里安排独立属性 当你使用synchronized关键字来保护代码块时&#xff0c;你必须通过一…

旧项目适配iphone6和iphone plus

iphone手机屏幕大小和像素&#xff1a;1.iPhone5/5s 320x568&#xff0c;像素640x1136&#xff0c;2x2.iPhone6 375x667&#xff0c;像素750x1334&#xff0c;2x3.iPhone6 Plus 414x736&#xff0c;像素1242x2208&#xff0c;3x旧的项目在xcode6上运行在iphone6或…

java之用反射实现方法(已知实体对象和实体参数)

1、问题 有个函数需要在Android 23&#xff08;6.0&#xff09;以上&#xff0c;但是我们的API是22,所以这个实体对象调用不了这个函数&#xff0c;这个时候我们应该想到的是反射&#xff0c;切记。 2、实现 同时看我写得很着急&#xff0c;因为我是先class.forName("**…

Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config

之前不小心删除了server的服务器设置&#xff0c;运行时各种报错Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config &#xff0c;网上找到解决方法记录下&#xff1a; 第一步&#xff1a;将左边的classpath中的server删除掉…

软件项目组织管理(一)项目管理概述

文章目录什么是项目项目的特征项目的组成要素&#xff08;三维约束&#xff09;什么是项目管理什么是IT项目什么是软件项目管理项目管理的目标&#xff08;项目成功的标志&#xff09;软件项目失败的原因活动的3个基本特点人类活动分为两种类型作业和项目的区别&#xff08;必考…

ABP Framework 5.2 RC 版本发布及新增功能介绍

本文将介绍 ABP Framework 5.2 RC 版新增的主要功能&#xff1a;•单层解决方案模板•API 版本控制•源代码控制移除libs文件夹•对 Swagger UI 隐藏 ABP 默认端点•CMS Kit应用模块自定义全局 CSS 和 JavaScript关注 ABP Framework 最新开发进度&#xff0c;后面还会陆续发布新…

《计算机组成原理》----2.3 二进制运算

本节书摘来自华章出版社《计算机组成原理》一书中的第2章&#xff0c;第2.3节&#xff0c; 作 者 Computer Organization and Architecture: Themes and Variations&#xff3b;英&#xff3d;艾伦克莱门茨&#xff08;Alan Clements&#xff09; 著&#xff0c;沈 立 王苏峰…

JTable常见用法细则

JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一.创建表格控件的各种方式:1) 调用无参构造函数. JTable table new JTable();2) 以表头和表数据创建表格. Object[][] cellData {{"row1-col1", "row1-col…

Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台

1、问题 判断程序是否运行在后台运行 2、解决办法 我们可以使用ActivityLifecycleCallbacks,对于ActivityLifecycleCallbacks&#xff0c;看我的这篇博客介绍() Android之ActivityLifecycleCallbacks的得到当前的activity的状态 &#xff08;http://blog.csdn.net/u01106870…

下拉刷新:继承listView控件

1、首先初始化的时候给控件监听OnScrollListener&#xff0c;其中onScroll的参数里得到第一个显示的条目&#xff0c;当第一个条目为0的时候就可以执行下啦刷新了。第二覆写的方法是 onScrollStateChanged就是滑动状态的监听&#xff0c;3种状态都是常量&#xff1a;快速滑动&a…

软件项目组织管理(二、三)项目管理与信息技术环境、项目管理过程组

文章目录系统方法系统管理三维模型组织环境组织的四个框架组织的结构项目生命周期管理评审虚拟团队什么是过程项目管理过程组系统方法 项目管理工作需要采取系统的方法&#xff0c;描述在解决复杂问题时所需的整体性和分析性方法。 系统哲学&#xff1a;将事情作为系统考虑的…

一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析

写在前面的一点小吐槽、一点杂感学 Haskell 学了一段时间之后&#xff0c;虽说拿他来写东西还是完全不行&#xff0c;但是看别的语言特性时&#xff0c;总是会带着一种“诶&#xff0c;这玩意在哪哪见过”的蜜汁既视感。且不说几乎成为现代编程语言标配的 Lambda 、闭包&#x…

svn之迁移代码技巧

1、问题 之前客户做了很多定制&#xff0c;加起来有10几个&#xff0c;每个项目里面4分代码&#xff0c;需要迁移到高版本里面去。我特么傻逼了看每次svn记录然后一个一个的修改&#xff0c;日了狗一样。 2、解决办法 点击到当前目录 svn showlog 然后 ctrl A 然后点击鼠标右…