深度解读.NET5 授权中间件执行策略
前文提要
2021.1月份我写了一个《这难道不是.NET5 的bug? 在线求锤?》,
讲述了我在实现[全局授权访问+特例匿名访问] 遇到的技术困惑: [特例匿名访问,还是走了认证流程]。
博客园上某大佬的看法:

大概的意思是说 : 不管是匿名访问还是鉴权访问,均先识别用户身份,再决定跳过授权/应用授权! [有身份访问 MVC Login]这个场景可以佐证这个看法。
头脑风暴
后来我又仔细检视看了授权的源代码,发现并不完整, 请看官仔细观察我原文的示例,
端点路由还有一个[健康检查],端点加上了[AllowAnonymous]
endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz");
这个端点并没有进入认证流程,从授权中间件源码上看也是如此。
故官方源码是否能进入认证逻辑: 关键是看能不能在端点上包含授权策略:
var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();
var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData);
if (policy == null)
{
await _next(context);
return;
}
健康检查端点直接应用了[AllowAnonymous](实际上你可以不加), 这样就没有授权策略(policy= null),这个时候自然跳过后续,进入业务逻辑。
甚至, 你可以这样写:
endpoints.MapControllers().RequireAuthorization().AllowAnonymous().WithDisplayName("default");
这样的代码也要进入认证逻辑,因为它包含了授权声明。
根据以上分析,.NET 5授权中间件的流程是这样的:

The official said:
Authorization is orthogonal and independent from authentication. However, authorization requires an authentication mechanism. Authentication is the process of ascertaining who a user is. Authentication may create one or more identities for the current user.
授权是正交的并且独立于验证。但是,授权需要身份验证机制。身份验证是确定用户身份的过程。认证可以为当前用户创建一个或多个身份。
思绪整理
我试图以一种流畅的、能自然其说的思路来理解官方的设计理念。
我们捋一捋:
当我“朴素的需求”到达端点时,端点第一时间拿到平铺的所有元数据信息metadata:

**针对这种矛盾体信息, 确实有不同的设计策略: **
**我理解的匿名优先: 不需要认证; **
官方认定的匿名优先,是在身份登记的前提下,匿名访问优先。。
也许我将”匿名优先“与“认证”联系在一起,并不合适,
官方可是将AllowAnonymous 放在授权组件的范畴。
Authorization components, including the AuthorizeAttribute and AllowAnonymousAttribute attributes, are found in the Microsoft.AspNetCore.Authorization namespace.
就这样吧, 匿名访问不表示"无需认证"; 匿名访问 是 授权模块的内容;授权的前提是认证。
深度解读.NET5 授权中间件执行策略的更多相关文章
- 如何用区块链技术解决信任问题?Fabric 架构深度解读
阿里妹导读:区块链技术,随着比特币的兴起而为大家所知.但是具体到技术本身,大家相对熟悉的几个词可能是“数据不可篡改”.“公开链”.“分布式数据”.“共识机制”等. 这篇文章将抛砖引玉,通过深度解读Hy ...
- SQL Server 2019 深度解读:微软数据平台的野望
本文为笔者在InfoQ首发的原创文章,主要利用周末时间陆续写成,也算近期用心之作.现转载回自己的公众号,请大家多多指教. 11 月 4 日,微软正式发布了其新一代数据库产品 SQL Server 20 ...
- AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(上篇)
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 张钦坤 腾讯研究院秘书长蔡雄山 腾讯研究院法律研究中心副主任祝林华 腾讯研究院法律研究中心助理研究员曹建峰 腾讯研究院法律研究中心高级研究员 ...
- 【转载】深度解读 java 线程池设计思想及源码实现
总览 开篇来一些废话.下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) ...
- Java并发指南12:深度解读 java 线程池设计思想及源码实现
深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...
- 我就是认真:Linux SWAP 深度解读(必须收藏)
我就是认真:Linux SWAP 深度解读(必须收藏) http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=2651660097& ...
- 重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) ...
- .NET 5 Preview 1的深度解读和跟进
这几天微软.NET 团队发布了.NET 5 Preview-1, 如约而至.很兴奋,因为.NET Core和.NET Framework终于实现了大一统,同时也很期待,期待.NET 5能给我们带来哪些 ...
- 深度解读SSH免密登录
深度解读SSH免密登录 我们都知道SSH是LINUX下很常用的命令,用来远程登陆其他的LINUX系统.如果只有一台,那也只是一个密码 ,也到还好.但如果是一个集群,每次都输入密码登录,难免会拉低效率. ...
随机推荐
- 浅谈ES6数组及对象的解构
一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...
- APACHE如何里一个站点绑定多个域名?用ServerAlias 转
APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写:<VirtualHost *:80>ServerAdmin i@kuigg. ...
- 风炫安全WEB安全学习第二十三节课 利用XSS获取COOKIE
风炫安全WEB安全学习第二十三节课 利用XSS获取COOKIE XSS如何利用 获取COOKIE 我们使用pikachu写的pkxss后台 使用方法: <img src="http:/ ...
- VsCode通过SSH连接远程服务器开发
前言 nil 正文 安装插件 安装VsCode官方插件 Remote - SSH Remote - SSH: Editing Configuration Files WSL(远程桌面连接需要Remot ...
- Linux复制某个目录下结构
Linux复制某个目录下结构 结合tree命令把当前目录下的文件夹路径存储到document.txt文件,然后再使用mkdir命令把document.txt文件下的目录输入创建: tree -fid ...
- SpringSecurity应用篇
前面吹水原理吹了一篇幅了,现在讲解下应用篇幅,前面说过,如果要用SpringSecurity的话要先导入一个包 <dependency> <groupId>org.spring ...
- mysqldump 的-T参数
/usr/local/mysql/bin/mysqldump -uroot -T /tmp lina xuehao 把lina数据库中的xuehao表在tmp目录下备份出来两个文件,一个是纯数据.tx ...
- [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
转载自:http://www.cnblogs.com/joeblackzqq/p/4526589.html From: http://m.blog.csdn.net/blog/langkeziju/1 ...
- 奇技淫巧,还是正统功夫? - Python推导式最全用法
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...
- 深入理解Redis之简单动态字符串
目录 SDS SDS与C字符串的区别 SDS获取字符串长度复杂度为O(1),C字符串为O(N) SDS杜绝了缓存区溢出 减少修改字符串时带来的内存重分配次数 二进制安全 Redis没有直接使用C语言传 ...