前面关于.Net Core如何进行用户认证的核心流程介绍完毕以后,.Net Core 认证系统之Cookie认证源码解析远程认证暂时不介绍,后期有时间,我会加上.接下去介绍认证组件是如何和认证组件一块儿协同工做.源码的路径以下,自行去github下载.ok,开始!html
一、认证组件的执行流程前端
Core启动认证组件的方式很简单.git
和认证系统同样,都是以中间件的形式提供服务.github
验证有没有注入受权组件的核心服务. 后端
接下去查看中间件的代码,以下:设计模式
校验过程就不说了,第一步:api
从终结点元数据中读取打了Authorize的特性的控制器和方法.那么意味这此时控制器已经被注入了,因此通常services.AddMvc()和add.UseMvc()是先于认证组件注入的.架构
且微软提示,若是你自定义了一个受权Filter,改变了认证逻辑,可能会形成错误,不建议这种方式.由于核心认证组件支持全部的业务扩展,不必再去定义额外的Filter.ide
接着看以下代码:post
AuthorizationPolicy类合并了须要认证的元数据和认证策略提供类.那去找找IAuthorizationPolicyProvider接口的实现,以下
在注入服务的时候,微软注入了默认的实现,又是Provider模式,Core底层大量采用了这个模式,因此若是你不知道,先去补补设计模式的知识点,能够参考本人的设计模式分类.这个设计模式很简单.不看代码就能猜出大体的实现,内部确定维护了一个键值对,Dic或者HashMap.那就去看看.
调用了AuthorizationOptions参数中的GetPolicy方法,对应
果真是个字典.这意味这咱们能够经过认证参数来配置认证策略,添加策略的方法以下:
ok,再去看看AuthorizationPolicy的构造,其维护了两个主要的属性,后面会介绍.
一个认证方案的名称和一个受权条件集合,到这里能够知道认证组件能够和受权组件集成到一块儿使用的结论.
讲到这,回到中间件
_prolicyProvider提供的是认证方案的名称和受权条件集合,以及须要被认证的元数据集合.
接着,看看AuthorizationPolicy.CombineAsync的实现
跳过参数校验,分析核心代码,第一步:
遍历须要受权的元数据集合
AuthorizationPolicyBuilder,受权策略Buidler生成器,负责生成受权策略。Buidler生成器模式,不懂其移步本人设计模式分类,很简单.
判断须要受权元数据的Policy属性,ok,到这里.很明显.咱们得看看Authorize特性
这个时候
红框里得值就为"自定义受权策略",接着经过policyProvider拿到对应得AuthorizationPolicy实例,本质就是认证策略名称为"自定义受权策略"的认证方案和受权条件集合.
接着经过policyBuilder将认证策略名称为"自定义受权策略"的认证方案和受权条件集合.
添加到AuthorizationPolicyBuilder实例的下面两个属性中去
此时,当你这样设置控制器或者其下的方法
说明你不在采用受权组件的默认策略,因此
接着
又去判断当前须要受权元数据的Authorize特性中是否设置了Roles特性,且能够设置多个,以","分隔
到这里说明自定义策略受权和Role受权是能够共存的,能够向下面这样
接着
这个方法本质,就是向AuthorizationPolicyBuilder实例的
追加受权条件.
简单说下为何微软要给受权组件预留Roles角色集合,由于当前市面上主流的权限设计系统都是RBAC模式,中文就是基于角色(Role)的权限管理系统.
接着
这里和角色同样不介绍了
到这里你会发现 基于认证方案受权策略+基于角色的受权策略=自定义策略的受权策略.
接着,若是没有任何控制器或者方法使用受权策略,那么使用最基本的拒绝匿名访问api策略
核心代码以下:
若是当前用户未认证,则不能访问.
固然这个策略也能够经过AuthorizationOptions参数进行重写.
最后
去重构建一个新的PolicyBuilder对象实例.
接着
执行PolicyBuilder中的用户认证,其中作了一些重复登录的处理.本质就是如此.
这段代码就能够看出.若是当前用户未登录,则返回
接着回到中间件
认证完毕以后,若是当前元数据打了AllowAnonymous特性像下面这样
这样意味这以前的工做都白作了.直接跳过受权.
最后
调用受权服务,进行受权校验.默认的受权服务注入点以下:
构建受权上下文,接着拿到全部的受权处理器.遍历执行
这个参数,可配置,当一个受权策略校验失败,便再也不执行接下去的受权策略.
最后返回受权结果
总结:本质就是将
特性中的这两个参数,交给IAuthorizationHandler受权处理器处理.固然若是你制定了认证方案,那么则会去判断当前用户是否登录.
整个流程结束.纯属我的理解,能力有限,有问题,请指正,谢谢.
接下去会写一篇动态受权的文章,这样就能将受权组件+认证组件+权限系统集合起来实现完成用户认证和api动态受权.为后期的前端后端分离架构-基于id4的password模式+JwtBear认证+identity的受权认证中心作准备.最后造成一个完整的受权认证中心.
g