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谈起 当我们最开始学习一门 ...
随机推荐
- AESUtil_1
package com.tebon.ams.util;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; ...
- JAVA多线程学习十一-线程锁技术
前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...
- JAVA多线程学习四 - CAS(乐观锁)
本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助. 什么是悲观锁.乐观锁?在java语言里,总有一些名 ...
- Java数组问题:Array constants can only be used in initializers
感谢大佬:https://www.cnblogs.com/fanerwei222/p/11491571.html 感谢大佬:https://blog.csdn.net/weixin_42591732/ ...
- autorelease基本使用
1.autorelease基本概念 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里 ...
- CABasicAnimation动画
使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...
- 纯JS脚本发送HTTP请求
1 var xmlHttp; 2 var iii = 0; 3 if (window.XMLHttpRequest) { 4 xmlHttp = new XMLHttpRequest(); 5 if ...
- pytest(6)-Fixture(固件)
什么是固件 Fixture 翻译成中文即是固件的意思.它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作 ...
- MASA Framework - DDD设计(1)
目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 MASA Framework - MASA Framework - DDD设计(1) DD ...
- JDBC加强
一.使用PreparedStatement预编译语句防止SQL注入 什么是SQL注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行 ...