.Net Core手撸一个基于Token的权限认证

说明

权限认证是确定用户身份的过程。可确定用户是否有访问资源的权力

今天给大家分享一下类似JWT这种基于token的鉴权机制

基于token的鉴权机制,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用,不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

流程上是这样的:

•用户使用用户名密码来请求服务器•服务器进行验证用户的信息•服务器通过验证发送给用户一个token•客户端存储token,并在每次请求时附送上这个token值•服务端验证token值,并返回数据

那我今天给大家手撸一个类似Jwt的权限认证

演示

新建一个授权筛选器继承IAuthorizationFilter

public class ApiAuthorize : IAuthorizationFilter{}

新建一个需要应用授权的特性和允许未通过身份验证也可以访问的特性

public class MyAuthentication:Attribute, IFilterMetadata{}public class MyNoAuthentication : Attribute, IFilterMetadata{}

我们需要在我们的授权过滤器判断请求头是否带有应用授权的特性和允许未通过身份验证也可以访问的特性,如果有允许未通过身份验证也可以访问的特性就直接进入下一个管道 ,如果带有应用授权的特性则进行token判断

public class ApiAuthorize : IAuthorizationFilter{public void OnAuthorization(AuthorizationFilterContext context){if (context.Filters.Contains(new MyNoAuthentication())){return;}var authorize = context.HttpContext.Request.Headers["MyAuthentication"];if (string.IsNullOrWhiteSpace(authorize)){context.Result = new JsonResult("请求authorize不能为空");return;}if (!MemoryCacheHelper.Exists(authorize)){context.Result = new JsonResult("无效的授权信息或授权信息已过期");return;}}}

可能有的小伙伴发现了,那我们Token怎么去存取呢,一般的方案是使用Cache来处理,这里就不做过多讨论了,有想了解的小伙伴可以看我上一篇文章!

CacheHelper代码

public class MemoryCacheHelper{public static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());/// <summary>/// 验证缓存项是否存在/// </summary>/// <param name="key">缓存Key</param>/// <returns></returns>public static bool Exists(string key){if (key == null){throw new ArgumentNullException(nameof(key));}return _cache.TryGetValue(key, out _);}/// <summary>/// 获取缓存/// </summary>/// <param name="key">缓存Key</param>/// <returns></returns>public static object Get(string key){if (key == null){throw new ArgumentNullException(nameof(key));}if (!Exists(key))throw new ArgumentNullException(nameof(key));return _cache.Get(key);}/// <summary>/// 添加缓存/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">缓存Value</param>/// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>/// <param name="expiressAbsoulte">绝对过期时长</param>/// <returns></returns>public static bool AddMemoryCache(string key, object value){if (key == null){throw new ArgumentNullException(nameof(key));}if (value == null){throw new ArgumentNullException(nameof(value));}_cache.Set(key, value,new MemoryCacheEntryOptions(){SlidingExpiration = new TimeSpan(0, 0, 10),Priority = CacheItemPriority.NeverRemove,AbsoluteExpiration = DateTime.Now.AddMinutes(1)});return Exists(key);}}

权限认证代码基本完成了,我们回到刚刚的流程

用户使用用户名密码来请求服务器, 服务器进行验证用户的信息,服务器通过验证发送给用户一个token

对于一个商用软件来说绝大多数接口都需要应用授权后才能使用,所以我们注册到全局, 在StartUp类里面注册

public void ConfigureServices(IServiceCollection services){services.AddControllers(o=>{o.Filters.Add<ApiAuthorize>();o.Filters.Add<MyAuthentication>();});}

Token生成原理我这里就不做过多解读了,本例子使用AES加密生成Token 在我们服务端的请求token接口加上允许未通过身份验证也可以访问的特性,然后颁发一个Token

[HttpGet("GetToken")]
[MyNoAuthentication]
public IActionResult GetToken(string UserCode)
{string token=  AESEncrypt.Encrypt(UserCode);MemoryCacheHelper.AddMemoryCache(token, User);eturn Ok(token);
}

使用Postman请求生成token,如图所示

e3b22d481821f2b7e4af85470d228da8.png

然后我们在新增一个需要应用授权的接口,由于我们注册了全局的应用授权特性就不需要在带上该特性了

[HttpGet("GetUserInformation")]public IActionResult GetUserInformation(){return Ok(new { Name="123",Age=18,Sex="性别"});}

不带token使用postman请求该接口,如图所示

cf69a88d17a2ad5f0bac1b8b4b3abb6c.png

带上token使用postman请求该接口,如图所示

93fd25ddbc52b0b0c4cfed84a073a6f0.png

通过刚才的例子我们清楚了解了权限认证的过程,今天的介绍就到此结束了!

最后大家如果喜欢我的文章,还麻烦给个关注并点个赞, 希望net生态圈越来越好!

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

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

相关文章

Mybatis-Generator(MBG)教程与Idea的MBG插件

简介 Mybatis Generator(MBG)&#xff0c;下面我们统称为MBG&#xff0c;是一个Mybatis和iBatis的代码生成器。他可以内省数据库的表&#xff08;或多个表&#xff09;然后生成可以用来访问&#xff08;多个&#xff09;表的基础对象。这样减少了项目新建时各种配置对象&#x…

net MVC 重定向总结

[HttpPost]public ActionResult StudentList(string StudName, string studName, DateTime BirthDay, FormCollection form, string controller, string Action, StudentModels student){//其中StudName为aspx页面中标签的name属性(StudName不区分大小写)//其中BirthDay为页面中…

Android之华为meta10 pro安卓8.0绑定服务(bindService)失败解决办法

1、问题 Intent intent new Intent("com.gsta.ukeyesurfing.service.UkeyService"); boolean result bindService(intent, mKeyServiceConnection, Context.BIND_AUTO_CREATE) result结果是false&#xff0c; android 8.0绑定服务失败 2、解决办法 这个服务需要…

Windows Server 2008 RemoteApp---发布应用程序

本章节一起来体验RemoteApp应用程序发布功能&#xff0c;本功能利用了微软应用程序虚拟化技术&#xff0c;打个比方&#xff0c;我这台电脑上并没有安装Excel2010&#xff0c;但我现再要用Excel2010该怎么办&#xff1f;难道去找Office2010的光盘来安装吗&#xff1f;不用这么麻…

【GIS风暴】最新全球(全国)土地利用数据集下载地址大全汇总

目 录 1. GlobeLand30 2. 地理空间数据云 3. 马里兰大学数据集 4. Modis MCD12(MODQ1\MODQ2)

.NET 中密封类的性能优势

.NET 中密封类的性能优势Intro最近看到一篇文章 Performance benefits of sealed class in .NET&#xff0c;觉得写得不错&#xff0c;翻译一下&#xff0c;分享给大家。目前看到的一些类库中其实很多并没有考虑使用密封类&#xff0c;如果你的类型是不希望被继承的&#xff0c…

java 视图对象转换_java-如何从onItemSelected()方法返回的视图对象...

onItemSelected()方法应该返回一个View作为其对象之一,在这种情况下,它是一个TextView,通过在Logcat中获取该对象的描述和哈希值进行了验证,因此该View实际上是一个TextView.通过此处显示的方法返回的视图public void onItemSelected(AdapterView> parent, View view, int p…

jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定

事件绑定的方式有很多种。使用了jQuery那么原来那种绑定方式&#xff08;elem.click function(){...})就不推荐了&#xff0c;原因&#xff1f; 最主要的一个原因是elem.click fn这种方式只能绑定一个事件处理&#xff0c;多次绑定的只会保留最后一次绑定的结果。 看一下jQue…

Windows 8系统平台上应用软件安装心得

1.ArcGIS 10.2安装 需要单独安装.NET 3.5,GIS软件自带的.NET系统不识别&#xff0c;点击360云盘地址进行下载&#xff08;提取码为&#xff1a;1ed3&#xff09;。&#xff08;另外&#xff0c;Win8系统上安装.NET可以参考&#xff1a;http://blog.csdn.net/aijavaer/article/d…

JavaFX 一 出生新手村(阅读小规则)

我就不讲IDE怎么装的,网上有的是,我仅仅是说说我学习过程中遇到的,该注意的东西 1.JavaFX刚開始出是基于脚本script开发的语言,所以网上会有流传比較多关于script的JavaFX,对于被甲骨文大大(Oracle)改版后的JavaFX已经不太有用了,如今都基本靠java代码编程了,所以网上找到的scr…

Android之jni编译出现multiple definition of ‘××××ב

1、问题 编译ndk代码的时候提示 multiple definition of 2、原因 多个文件包含同一个头文件时&#xff0c;在Android.mk文件里面写了2个文件 _src_files : \common/A.cpp\common/A.cpp\ 3、解决办法 去掉一个文件&#xff0c;然后再次编译。

Android视图绘制流程完全解析,带你一步步深入了解View(二)

转自&#xff1a;http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中&#xff0c;我带着大家一起剖析了一下LayoutInflater的工作原理&#xff0c;可以算是对View进行深入了解的第一步吧。那么本篇文章中&#xff0c;我们将继续对View进行深入探究&…

C# 线程问题之死锁

过多的锁定也会有麻烦。在死锁中&#xff0c;至少有两个线程被挂起&#xff0c;并等待对方解除锁定。由于两个线程都在等待对方&#xff0c;就出现了死锁&#xff0c;线程将无限等待下去。为了说明死锁&#xff0c;下面实例化 StateObject 类型的两个对象&#xff0c;并把它们传…

java requestbody map_@RequestBody 的正确使用办法

1.以前一直以为在SpringMVC环境中&#xff0c;RequestBody接收的是一个Json对象&#xff0c;一直在调试代码都没有成功&#xff0c;后来发现&#xff0c;其实 RequestBody接收的是一个Json对象的字符串&#xff0c;而不是一个Json对象。然而在ajax请求往往传的都是Json对象&…

Matlab图形绘制

1.正余弦曲线 例如自变量从0到10&#xff0c;间隔为0.1的曲线代码如下&#xff1a; 正弦 t 0:.1:10; y sin(t); plot(t,y); 余弦 t 0:.1:10; y cos(t); plot(t,y); 正余弦图形显示如下&#xff1a;

java之异常java.net.MalformedURLException解决办法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、问题 日志打印 System.err W java.net.MalformedURLExceptionW at java.net.URL.<init>(URL.java:152)W at java.…

java遇见的问题分析

下面就一些java的一些基本问题进行解释。其中蓝色部分为handsomecui的主观看法 一.synchronized(obj)里面的参数怎么解释&#xff1f; synchronized的参数代表的是“对象锁”代表的是不同的线程在synchronized块里&#xff0c;同时只有一个线程能执行该代码块,而类的不同实例之…

linq中的castT()及OfTypeT()

DataTable dt...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow rowdt.Rows.Cast<DataRow>().Single(); //OfType<T>():用来将序列中可以转换的转换为指定的序列 如&#xff1a;一个object数…

Jar包转成Dll的方式(带嵌套的jar也能做) (转)

研究很好几天&#xff0c;终于成功了。因为写了一个Java的项目&#xff0c;现在要求要改写成C#版本的。但是其中用到了svnkit&#xff0c;svnkit是java平台的。改写成C#的话&#xff0c;要使用SharpSVN,但是SharpSVN的API文档真的很不专业。看来看去还是svnkit比较好。所以打算…

Blazor University (5)组件 — 字面量、表达式和指令

原文链接&#xff1a;https://blazor-university.com/components/literals-expressions-and-directives/字面量、表达式和指令源代码[1]请注意&#xff0c;本节一般不涵盖 Razor 标记。它不会涵盖诸如条件输出、循环等内容。该主题在网络和书籍中的其他地方得到了广泛的介绍。使…