.Net Core 认证组件源码解析

      不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Core是个非常优秀的框架,如果各位是从WebForm开始,一步步走到今天,自然而然就会发现.微软慢慢的开始将整个框架组件化,不在像以前那样,所以的东西都傻瓜化,比如WebForm,拖拖控件往往能搞定大部分的事情.Core的扩展性很好,将很多选择权交给我们自己,而不是强行的让我们去接受他那一套,对第三方组件的兼容性很好.换句话说,很多核心组件微软提供了高层抽象,如果你想换,可以,不想换,也可以,用他默认的实现.其他的优缺点也不一一细说了,也不是本文的重点。如果时间允许,建议大家可以深入的研究.Net Core的底层.

1、简介

省去前面的创建Core Web项目的一系列操作.VS帮你自动化初始化好所有的基础组件、环境.第一步就是认证.就是登陆.当然微软提供了一套登陆组件.很全,很完善。项目在Core源码 

 Security文件夹下,源码自行去github下载.里面提供了若干个认证方法,常见的Cookie认证、JwtBear认证等等.还包括FaceBook、Google等远程认证方式.

本文暂时不讲解具体的认证方式,主要阐述核心认证流程.

 

(1)、认证系统的执行过程

Core启动认证系统的方式很简单

 

 很简单的一段代码,看看它干了什么

 

 很简单,注入认证中间件,关于中间件这里就不说多,不是文本的重点,自行百度.看看中间价干了什么.

 

 核心代码,首先拿到DI中注入的认证请求处理器集合,接着去DI中获取认证处理方案集合中的处理认证请求上下文的方案类.接着去处理器集合中拿到处理远程认证请求上下文的方案类对应的认证请求处理器,接着执行处理器的HandleRequestAsync方法,完成远程认证的处理.

 

接着

 

 远程认证流程执行完毕之后,直接return.反之,如果当前不是使用远程认证,接着去认证方案中拿到默认的认证方案,不为空,执行上下文的扩展方法context.AuthenticateAsync,这个方法干了什么如下:

 

 执行DI中注入的认证服务方法,并传入上下文和默认的认证方案名称.

 

 先判断存不存在默认认证方案,不存在抛异常,接着去所有的认证处理器集合中拿到默认认证方案的处理器.接着调用处理的认证方法,认证成功,判断当前用户身份集合中在临时缓存中存不存在,不存在,可以执行Claim的转换.这很好,说明用户认证成功之后的Cliam也是可以被转换的.

 

 只要注入IClaimsTransformation服务即可,你就可以执行你需要的业务的Claim转换,最后返回结果

 到这里整个认证流程结束.非常的简单.且关键点的扩展微软都预留了.可以自定义实现

 

(2)、流转服务的介绍.

上面介绍了整个认证组件的流转过程,因为我对流程很清楚,所以大家可能还是不理解.所以接下去开始介绍流转必须服务的注入.

 认证处理器的Provider类,那么Core是在哪里注入认证处理器的呢?

 这里,核心也是红框里的,下面的只是一些依赖组件。

 微软注入默认的认证处理器.看下获取处理器的实现,对应中间件.

 

 阅读源码发现,Provider类并不具体实现提供认证处理器的方法.而是通过SchemeProvider来提供.

 

原来是IAuthenticationSchemeProvider类提供认证处理器.而且是通过反射实现(这点开销,就没必要考虑性能问题,当然你可以考虑重构),那么问题来了,在哪里出入IAuthenticationSchemeProvider服务内,回到上面那张图

 

 微软也提供了默认实现,去看看GetSchemeAsync方法的实现

 

 

 ok,到这里就说明认证处理器是通过向这个字典写入值,来实现的.

 上面是认证方案AuthenticationScheme类的核心字段,HandlerType就是认证处理器.

 

AuthenticationSchemeProvider类维护了一个_schemes的字典,通过它向外输出.认证方案集合提供类.

 接着认证处理器集合提供类AuthenticationHandlerProvider通过解析

认证方案集合提供类,拿到所有的认证处理器.

到这里,很明显,所有的认证处理器都是通过向AuthenticationSchemeProvider的_schemes字典注入认证处理器.既然如此,入口在哪?在AuthenticationBuilder类下面.

 下面是Cookie认证方式注入认证处理器的方式

 AddScmeme方法.在配置参数的同时,指定了处理器.

 

 接着,回到中间件的图

 我们通过AuthenticationBuilder的AddScheme方法向_schemes集合写入了认证处理器且配置了处理器的参数,接着通过AuthenticationHandlerProvider拿到了所有的认证处理器.

接着我们通过Schemes方案集合拿到所有处理认证请求上下文的处理器,执行处理认证请求上下文参数.处理完毕.

 

接着我们解析Schemes中提供的默认认证方案,代码如下:

 根据

 这个配置参数,一般在入口注入:

 中配置默认方案名称,拿到默认认证方案.再将处理过的认证请求上下文和默认方案传给IAuthenticationService,这个Service也有默认实现,如下:

 

 AuthenticationService将处理过的认证请求上下文交给具体的认证请求处理器来处理.并返回处理结果.认证请求处理器前面说过了,通过AuthenticationBuilder的AddScheme方法来注入.

到这里,整个组件的流程介绍结束.纯属个人理解,能力有限,有问题,请指正,谢谢.

下面开始介绍基于Cookie的认证组件.

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

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

相关文章

在.NET Core下的机器学习--学习笔记

摘要.NET Core 在机器学习的应用场景,除了 ML .NET 还会介绍一个非常棒的開源技術 TensorFlow .NET , Keras .NET.讲师介绍本课内容人工智能介绍ML .NETICSharpCoreTensorFlow .NETKeras .NETSciSharp人工智能应用图像识别/物体识别自然语言/翻译搜索/知…

asp.net core 自定义基于 HttpContext 的 Serilog Enricher

asp.net core 自定义基于 HttpContext 的 Serilog EnricherIntro通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QueryString/RequestHeader 等请求信息, StatusCode/ResponseHeader 等响应信息,借助 HttpContext 我们可以在日志中记录很多有用…

我的 .NET Core 博客性能优化经验总结

点击上方蓝字关注“汪宇杰博客”导语去年8月,我用 .NET Core 重写了我的博客系统。经过一年多的优化,服务器响应速度从上线时候的 80ms 提高到了现在的 8ms,十倍提速。可惜由于部署在国外,自然不可抗力会导致中国用户晚上访问速度…

Redis 6 RC1发布,带来众多新特性

Redis 6 RC1 发布了,项目创建人 antirez 在博客中介绍,这是迄今最“企业”化的版本(SSL 与 ACL 等特性与企业极相关),也是最大的版本,同时也是参与人数最多的版本。GA 版本预计在明年三月到五月之间发布。R…

Serverless那么火,2019年的采用如何?

传统的 IT 架构已经不适合当今快速发展的数字经济环境。技术顾问 Declan Morris 表示:“客户不仅期望零停机时间,而且要求应用程序无论在世界任何地方都具有一致的性能。”他还预测到,接下来是 Serverless 计算和函数即服务(FaaS&…

【C】Natasha 插件编程

文章转载授权级别:CNatasha 是一个代替 Emit / Expression 的动态构建项目,旨在为开发者提供方便、快捷、高性能的动态构建服务,动态编程是生态的重要组成部分,希望开发者们能有足够的兴趣来了解、使用、建设它。1、插件生成使用 …

二叉树先序,中序,后序,层次遍历(数据结构)

先序遍历 先序遍历可以想象为,一个小人从一棵二叉树的根节点为起点,沿着二叉树的外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果 先序遍历的结果为:A B D H I E J C F K G 中序遍…

.NET Core 在 K8S 上的开发实践--学习笔记

摘要本主题受众是架构师,开发人员,互联网企业 IT 运维人员。大纲:1、 K8S 对应用的要求;2、 .NET Core 上 K8S 的优势;3、 K8S 下的 .NET Core 配置;4、 .NET Core 上分布式组件概览。大纲kubernetes 对应用…

.NetCore 3.1 安装本地化中文智能提示

A、平时在群里,很多小伙伴都会问,.net core的智能提示和注释都是英文的,如果英语水平不是很高的,看着是挺麻烦,所以经常需要在身边有一个翻译软件,如果有汉化的中文智能提示就好了(当然&#xf…

asp.net core 3.x Endpoint终结点路由1-基本介绍和使用

前言我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的。目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结点路由的相关概念和如何使用,不会详细介绍路由&#xff0c…

共享后缀的链表

有一种存储英文单词的方法,是把单词的所有字母串在一个单链表上。为了节省一点空间,如果有两个单词有同样的后缀,就让它们共享这个后缀。下图给出了单词“loading”和“being”的存储形式。本题要求你找出两个链表的公共后缀。 函数接口定义&…

C#反射与特性(一):反射基础

1. 说明1.1 关于反射、特性在 《C# 7.0 本质论》中,关于这方面的知识在 《第十八章 反射、特性和动态编程》;在《C# 7.0 核心技术指南》中,这部分内容在《第19章 反射和元数据》。[图片来自 《C# 7.0 本质论》]在这里我们可以获得一些关联性很…

收藏!推荐12个超实用的Visual Studio插件

工欲善其事,必先利其器,整理的一些我必装的12款Visual Studio插件,希望你们能get到。效率工具前文传送门:推荐:程序员必装的10款谷歌插件程序员必备的8个学习工具99%的人不知道搜索引擎的6个技巧01 CodeMaidCodeMaid快速整理代码文…

搭建独立博客,这款评论插件不能错过

微信公众号因为申请的时间晚,一直到现在都无法开通评论功能,之前博客一直使用的多说作为评论系统,自从多说关闭后,好多年都处于无评论状态,最近发现 gitalk 还不错,所以在博客中进行了对 gitalk 的集成&…

最大堆和最小堆(数据结构)

堆和栈的区别: 一、空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等。其操作方式类似于数据结构中的栈堆(操作系统):一…

2019公众号总结之——Top100 技术文章汇总

大家好,我是张善友。新年伊始,我们在欢送10年代的同时迎来了20年代。在这个崭新的时代,感谢各位朋友一直关注“dotnet跨平台”。一晃5年有余,关注公众号的粉丝6万,相对于.NET开发人员,希望2020年有更多小伙…

树,森林,二叉树的互相转换

树、森林到二叉树的转换 将树转换为二叉树 树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就将树转换成相应的二叉树: 在所有兄弟结点之间加一连线对每个结点,除了保留与其长子的连线外&am…

数据丢失引起宕机怎么办?

做过系统开发和运维的朋友,应该最怕数据丢失问题出现,更严重的是造成无法恢复的糟糕境地,简直叫人崩溃啊,这周有一个朋友跟我咨询这方面的事情,就整理了一下数据库自动异地备份的方法,分享给大家。大家都知…

ASP.NET Core跨平台技术内幕

ASP.NET Core设计初衷是开源跨平台、高性能Web服务器,其中跨平台特性较早期ASP.NET是一个显著的飞跃,.NET现可以理直气壮与JAVA同台竞技,而ASP.NET Core的高性能特性更是成为致胜法宝。ASP.NET Core 2.1为IIS托管新增In-Process模型并作为默认…

使用 Visual Studio Code 进行远程开发

在完成了 AT 指令入门的学习之后,接下来就要使用 AT 指令进行 Socket 通信了。问题在于,之前 .NET 的 Socket 编程只需一台电脑便可进行学习,服务器和客户端都可以在本机运行,也可以分别运行在局域网上的两台电脑之上。而 NB-IOT …