深度解读.NET 5授权中间件的执行策略

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 匿名访问不表示"无需认证";匿名访问是"授权" 的控制范畴; 授权的前提是先认证。

前文提要


2021.1月份我写了一个《这难道不是.NET5 的bug? 在线求锤?》,


讲述了我在实现[全局授权访问+特例匿名访问] 遇到的技术困惑:    [特例匿名访问,怎么走了认证流程?]。


博客园上某大佬的看法:


4014c72a926ad278748285ef66e8e57d.png


大概的意思是说 :不管是匿名访问还是鉴权访问,均先识别用户身份,再决定跳过授权/应用授权![有身份访问 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授权中间件的流程是这样的


3cf25ef158daa313ae7289ef4ed4b2ef.png


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:  


(直接附加在端点上的声明信息 & MVC上附加的特性 & 全局附加的过滤器)


bb4805bcb51297789c005db2d7ecb79c.png


针对这种矛盾体元数据,    确实有不同的设计策略:


我理解的匿名优先:不需要认证;


官方认定的匿名优先,是在身份登记的前提下,匿名访问优先。


也许我将”匿名优先“与“无需认证”联系在一起,并不正确。 官方可是将AllowAnonymous 放在授权的范畴。  


>  Authorization components, including the AuthorizeAttribute and AllowAnonymousAttribute attributes, are found in the Microsoft.AspNetCore.Authorization namespace.


就这样吧, 匿名访问不表示"无需认证";匿名访问是"授权" 的控制范畴;    授权的前提是先认证。

相关文章
|
5月前
|
缓存 监控 NoSQL
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
138 0
|
9月前
|
开发框架 数据可视化 .NET
.netcore第三方登录授权:10分钟急速接入
.netcore第三方登录授权:10分钟急速接入
|
9月前
|
开发框架 前端开发 JavaScript
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
|
9月前
|
开发框架 算法 NoSQL
.NET服务治理之限流中间件-FireflySoft.RateLimit2
.NET服务治理之限流中间件-FireflySoft.RateLimit2
91 0
|
9月前
|
存储 开发框架 算法
.NET服务治理之限流中间件-FireflySoft.RateLimit1
.NET服务治理之限流中间件-FireflySoft.RateLimit1
97 0
|
12月前
|
开发框架 中间件 .NET
asp.net core 自定义中间件【以dapper为例】
asp.net core 自定义中间件【以dapper为例】
119 0
|
存储 开发框架 .NET
ASP.NET Core策略授权和ABP授权
ASP.NET Core策略授权和ABP授权
256 0
ASP.NET Core策略授权和ABP授权
|
存储 开发框架 安全
ASP.NET Core 3.0一个jwt的轻量角色/用户、单个API控制的授权认证库
ASP.NET Core 3.0一个jwt的轻量角色/用户、单个API控制的授权认证库
163 0
ASP.NET Core 3.0一个jwt的轻量角色/用户、单个API控制的授权认证库
|
存储 开发框架 安全
ASP.NET Core 使用JWT 自定义角色/策略授权需要实现的接口
ASP.NET Core 使用JWT 自定义角色/策略授权需要实现的接口
359 0