今天我们来探索一下ASP.NET Core中关于权限认证,所谓权限认证,就是通过某些方式获取到用户的信息。

需要开启权限认证,我们首先需要在容器中注入认证服务,使用services.AddAuthentication。进入该方法的源码,最重要的其实就是AddAuthenticationCore方法,他向容器中注入了认证体系中很重要的对象:IAuthenticationServiceIAuthenticationHandlerProviderIAuthenticationSchemeProvider

 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的更多相关文章

  1. ASP.NET Core框架探索之Authorization

    今天我们一起来探索一下ASP.NET Core框架中的Authorization.我们知道请求进入管道处理流程先会使用Authentication进行用户认证,然后使用Authorization进行用 ...

  2. ASP.NET Core框架探索(一)

    今天我们来结合源码来探究一下ASP.NET CORE Web框架的运行原理. 可以先整体看一下下面这张基于源码分析过程的一个总结大纲,包含各环节完成的关键步骤: 下面我们将一起来结合源码探索启动一个A ...

  3. 一个Mini的ASP.NET Core框架的实现

    一.ASP.NET Core Mini 在2019年1月的微软技术(苏州)俱乐部成立大会上,蒋金楠老师(大内老A)分享了一个名为“ASP.NET Core框架揭秘”的课程,他用不到200行的代码实现了 ...

  4. 200行代码,7个对象——让你了解ASP.NET Core框架的本质

    2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...

  5. ASP.NET Core 框架源码地址

    ASP.NET Core 框架源码地址 https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet  ...

  6. 了解ASP.NET Core框架的本质

    了解ASP.NET Core框架的本质 ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET ...

  7. 一步步完成“迷你版” 的ASP.NET Core框架

    一 前言 Artech 分享了 200行代码,7个对象--让你了解ASP.NET Core框架的本质 . 用一个极简的模拟框架阐述了ASP.NET Core框架最为核心的部分. 这里一步步来完成这个迷 ...

  8. 200行代码,7个对象——让你了解ASP.NET Core框架的本质

    原文:200行代码,7个对象--让你了解ASP.NET Core框架的本质 2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘&g ...

  9. ASP.NET Core框架的本质

    源文章地址:http://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 1.从Hello World谈起 当我们最开始学习一门 ...

随机推荐

  1. JS中的堆内存与栈内存

    在js引擎中对变量的存储主要有两种位置,堆内存和栈内存. 和java中对内存的处理类似,栈内存主要用于存储各种基本类型的变量,包括Boolean.Number.String.Undefined.Nul ...

  2. Java向mysql中插入时间的方法

    ava向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源  java向MySQL插入当前时间的四种方式 第一种:将java.util.Date类型的 ...

  3. Netty入门使用教程

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11827026.html 本文介绍Netty的使用, 结合我本人的一些理解和操作来快速的让初学者 ...

  4. 让我一时不知所措 Linux 常用命令 爱情三部曲 下部

    Linux目录与文件管理 我试着把你忘记,可总在夜里想你~ 1.linux目录结构 2.查看及检索文件 3.压缩及解压缩文件 4.vi文本编辑器 1.Linux目录结构:树形目录结构根目录:所有分区, ...

  5. 按照递推的思想求解next[]数组

    按照递推的思想求解next[]数组 根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1] 若P[j]P[k],则有P[0..k]P[j-k,j],很显 ...

  6. 敲出的第一个python程序

    学习python第二天,终于照猫画虎编辑出第一个程序.程序要求如下: 1.输入用户名.密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 源代码如下: username = 'jackson'pas ...

  7. windows gdi+ Bitmap 总结

    windows gdi+ 是对 windows gdi 的一个c++封装,同时增加了一些扩展功能,如反走样,样条曲线,变换矩阵,图像编解码等. gdi+ 相对于 gdi 也存在一些不足之处,如 执行效 ...

  8. Argo workflow 案例练习和配置详细解析

    参数化 - parameters hello-world-parameters.yaml文件解析 apiVersion: argoproj.io/v1alpha1 kind: Workflow met ...

  9. 深入MySQL(三):MySQL的索引的应用

    在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能.所以如果是深入MySQL,那么索引绝对是其中重要的一部分. My ...

  10. hydra安装及破解rdp方法

    hydra暴力破解工具 下载:https://github.com/vanhauser-thc/thc-hydra 安装步骤: ./configure make&&make insta ...