ASP.NET Core框架探索之Authentication
今天我们来探索一下ASP.NET Core中关于权限认证,所谓权限认证,就是通过某些方式获取到用户的信息。
需要开启权限认证,我们首先需要在容器中注入认证服务,使用services.AddAuthentication。进入该方法的源码,最重要的其实就是AddAuthenticationCore方法,他向容器中注入了认证体系中很重要的对象:IAuthenticationService、IAuthenticationHandlerProvider、IAuthenticationSchemeProvider

1 public static IServiceCollection AddAuthenticationCore(this IServiceCollection services)
2 {
3 if (services == null)
4 {
5 throw new ArgumentNullException(nameof(services));
6 }
7
8 services.TryAddScoped<IAuthenticationService, AuthenticationService>();
9 services.TryAddSingleton<IClaimsTransformation, NoopClaimsTransformation>(); // Can be replaced with scoped ones that use DbContext
10 services.TryAddScoped<IAuthenticationHandlerProvider, AuthenticationHandlerProvider>();
11 services.TryAddSingleton<IAuthenticationSchemeProvider, AuthenticationSchemeProvider>();
12 return services;
13 }
然后还需要在Configure管道处理中加上需要权限认证app.UseAuthentication(),该方法会向处理管道中添加名为AuthenticationMiddleware的中间件,具体一个请求到来时,框架是如何进行权限认证的处理逻辑都在这里。
下面我们就大致讨论一下AuthenticationMiddleware中间件中对于权限认证过程的细节:
1、请求进入认证环节,首先会进入IAuthenticationSchemeProvider对象拿到AuthenticationOptions对象中的IList<AuthenticationSchemeBuilder>集合,所有注册到认证体系中的认证方案都会在该集合中拿到。
2、通过循环集合,调用AuthenticationSchemeBuilder对象的Builder方法去获得所有的认证方案AuthenticationScheme,将得到的AuthenticationScheme以AuthenticationScheme.Name作为key保存到AuthenticationSchemeProvider对象的字典集合IDictionary<string, AuthenticationScheme>中,这样AuthenticationSchemeProvider就拥有了返回AuthenticationScheme的能力,通过传入认证方案名称,即可得到方案对象。
3、拿到了AuthenticationScheme对象,其认证处理类型即可在HandlerType属性中得到,然后在IAuthenticationHandlerProvider的实例对象中根据HandlerType创建一个认证处理对象IAuthenticationHandler,最后调用该对象的AuthenticateAsync方法就是完成具体的认证处理逻辑。需要注意的是这里的IAuthenticationHandler对象会根据每个AuthenticationScheme具备的认证处理逻辑而来,所以得到的AuthenticationScheme不同,认证处理的逻辑就不同。
下图是我针对认证流程画的一个的大致过程:

以上就是用户认证体系中大致认证逻辑,当然通过以上的描述还会存在以下疑点:
1、进入认证环节后,AuthenticationSchemeProvider可能会拥有很多个AuthenticationScheme,需要通过传入某个认证方案名称来拿到具体的AuthenticationScheme,那么这个传入的动作是在哪里呢?
2、AuthenticationSchemeProvider对象在实例化的时候从AuthenticationOptions对象中获取IList<AuthenticationSchemeBuilder>集合进行循环Builder得到AuthenticationScheme,那AuthenticationOptions中该集合的数据是在什么时候添加进去的呢?
3、如何在认证体系中添加需要的AuthenticationScheme呢?
以Cookie为例,我们会在向容器添加认证服务的时候就会指定默认的认证方案名称:service.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme),方法返回AuthenticationBuilder,但此刻还只是组建了认证服务的框架,还需要向这个框架中添加处理认证的方案,所以会通过AuthenticationBuilder.AddCookie将Cooike的认证方案添加进来,当然我们可以添加很多个方案,比如使用JWT进行认证,但实际认证过程还是根据传递的默认方案的名称进行的。
今天的分享就到这里,后续会继续带来更多关于ASP.NET Core框架的解读,希望有收获的小伙伴推荐支持一下,有疑问可评论区留言讨论!
ASP.NET Core框架探索之Authentication的更多相关文章
- ASP.NET Core框架探索之Authorization
今天我们一起来探索一下ASP.NET Core框架中的Authorization.我们知道请求进入管道处理流程先会使用Authentication进行用户认证,然后使用Authorization进行用 ...
- ASP.NET Core框架探索(一)
今天我们来结合源码来探究一下ASP.NET CORE Web框架的运行原理. 可以先整体看一下下面这张基于源码分析过程的一个总结大纲,包含各环节完成的关键步骤: 下面我们将一起来结合源码探索启动一个A ...
- 一个Mini的ASP.NET Core框架的实现
一.ASP.NET Core Mini 在2019年1月的微软技术(苏州)俱乐部成立大会上,蒋金楠老师(大内老A)分享了一个名为“ASP.NET Core框架揭秘”的课程,他用不到200行的代码实现了 ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...
- ASP.NET Core 框架源码地址
ASP.NET Core 框架源码地址 https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet ...
- 了解ASP.NET Core框架的本质
了解ASP.NET Core框架的本质 ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET ...
- 一步步完成“迷你版” 的ASP.NET Core框架
一 前言 Artech 分享了 200行代码,7个对象--让你了解ASP.NET Core框架的本质 . 用一个极简的模拟框架阐述了ASP.NET Core框架最为核心的部分. 这里一步步来完成这个迷 ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
原文:200行代码,7个对象--让你了解ASP.NET Core框架的本质 2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘&g ...
- ASP.NET Core框架的本质
源文章地址:http://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 1.从Hello World谈起 当我们最开始学习一门 ...
随机推荐
- Swift 类的构造函数
构造函数的介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数. 如果是继承自NSObj ...
- 消息队列 - mac上安装RabbitMq (转)
什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...
- argc 和 argv
转载请注明来源:https://www.cnblogs.com/hookjc/ 如果用C寫一般的命令列工具,常透過main函式的argc,argv來取得使用者所輸入的命令參數.int main(int ...
- iOS 动画系列之动画解释
动画解释 译文 http://blog.jobbole.com/69111/ 原文 http://www.objc.io/issues/12-animations/animations-explain ...
- 学习:二维码、QR码、J4L-QRCode、java
开源码 Java 解码器(编码解码)下载:http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip Java QR Code O ...
- 计算机网络模型与5G协议
计算机网络模型与5G协议 目录 计算机网络模型与5G协议 一.分层思想 1.什么是分层思想 2.分层思想的优势 二.osi七层参考模型 1.国际标准化组织(ios) 2.七层模型及对应功能和硬件 3. ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件
文章目录 1.9.部署kubelet 1.9.0.创建kubelet bootstrap kubeconfig文件 1.9.1.创建kubelet配置文件 1.9.2.配置kubelet为system ...
- GAN实战笔记——第四章深度卷积生成对抗网络(DCGAN)
深度卷积生成对抗网络(DCGAN) 我们在第3章实现了一个GAN,其生成器和判别器是具有单个隐藏层的简单前馈神经网络.尽管很简单,但GAN的生成器充分训练后得到的手写数字图像的真实性有些还是很具说服力 ...
- 关于NSMutableAttributedString进行富文本 UILabel 的制作
//1.初始化与其他无异 NSMutableAttributedString *AttributedStr2 = [[NSMutableAttributedString alloc]initWithS ...
- 树莓派PICO刷入MicroPython内核的两种方式
一.MicroPython简介 MicroPython 是 Python 3编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行. 可以在 25 ...