.Net Core 授权系统组件解析
前面关于.Net Core如何进行用户认证的核心流程介绍完毕之后,.Net Core 认证系统之Cookie认证源码解析远程认证暂时不介绍,后期有时间,我会加上.接下去介绍认证组件是如何和认证组件一起协同工作.源码的路径如下,自行去github下载.ok,开始!

1、认证组件的执行流程
Core启动认证组件的方式很简单.


和认证系统一样,都是以中间件的形式提供服务.

验证有没有注入授权组件的核心服务.
接下去查看中间件的代码,如下:




校验过程就不说了,第一步:

从终结点元数据中读取打了Authorize的特性的控制器和方法.那么意味这此时控制器已经被注入了,所以一般services.AddMvc()和add.UseMvc()是先于认证组件注入的.
且微软提示,如果你自定义了一个授权Filter,改变了认证逻辑,可能会造成错误,不建议这种方式.因为核心认证组件支持所有的业务扩展,没必要再去定义额外的Filter.
接着看如下代码:

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
.Net Core 授权系统组件解析的更多相关文章
- .Net Core 认证系统之Cookie认证源码解析
接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且 ...
- .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析
介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...
- .Net Core 认证组件之Cookie认证组件解析源码
接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且 ...
- 从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析
http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...
- ONOS架构-系统组件
系统组件 系统分层 App/core/providers 业务和子系统 一个业务service是有多个组件构成的功能单元,基于各层软件栈提供一个垂直的分片slice,将构成业务service的组件集合 ...
- React Native组件(三)Text组件解析
相关文章 React Native探索系列 React Native组件系列 前言 此前介绍了最基本的View组件,接下来就是最常用的Text组件,对于Text组件的一些常用属性,这篇文章会给出简单的 ...
- 02 【PMP】项目管理系统、PMIS、工作授权系统、配置管理系统、变更管理
PMBOK融会贯通:盘点八大系统<项目管理系统.PMIS.工作授权系统.配置管理系统.变更管理> 一. PMBOK相关系统: 工作系统作为事业环境因素,提高或限制项目管理的灵活性,并 ...
- .NET CORE 授权
.NET CORE 授权 一.三种方式授权 不论使用NET CORE框架的何种授权都必须引入中间件,因为它实现了在管道中对当前请求的鉴权和授权的验证,在Startup中的Configure中首先加入鉴 ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
随机推荐
- 如何应用AxureRP做原型设计
什么是原型呢?这个在之前介绍为什么需要进行原型设计当中有提到,原型是产品的最初形态,确认用户对产品界面和操作功能可用性的需求,高保真的原型接近于产品的最终形态,但仍只是原型.产品原型简单的说就是产品设 ...
- Appium环境安装步骤 + 代码验证环境是否成功
1.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本. 如下图所示: 如果没有 ...
- 让html里的js脚本延迟5秒运行
setTimeout( function(){ //add your code}, 5 * 1000 );//延迟5000毫米
- collections中namedtuple的用法
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: p = (1, 2) 但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的.这时,namedtuple就派上了用 ...
- typeof 、Object.prototype.toString和 instanceof
数据类型 js 基本类型包括:Undefined symbol null string boolean number js 引用类型包括:object array Date RegExp typeo ...
- flink第一个应用
去年华为大佬就开始在用flink,今天刚有空就稍微跟着写了个demo玩起来(就不用java了 spark和flink还是用scala玩) package flink.testimport org.ap ...
- 最大似然估计(Maximum likelihood estimation)
最大似然估计提供了一种给定观察数据来评估模型参数的方法,即:"模型已定,参数未知".简单而言,假设我们要统计全国人口的身高,首先假设这个身高服从服从正态分布,但是该分布的均值与方差 ...
- [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率
Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...
- 主从复制系列A
一.主从原理 Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...
- SolrCloud4.7.1分布式部署
一.环境 软件: apache-tomcat-7.0.53.tar.gz solr-4.7.1.tgz zookeeper-3.4.6.tar.gz 规划: 三个节点IP: 192.168.50. ...