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

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 匿名访问不表示"无需认证";匿名访问是"授权" 的控制范畴; 授权的前提是先认证。

前文提要


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.


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

相关文章
|
2月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
40 4
|
3月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
79 1
|
3月前
|
开发框架 前端开发 中间件
聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别
聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别
118 1
|
3月前
|
开发框架 缓存 NoSQL
聊聊 ASP.NET Core 中间件(一):一个简单的中间件例子
聊聊 ASP.NET Core 中间件(一):一个简单的中间件例子
|
3月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
118 0
|
3月前
|
开发框架 中间件 .NET
聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?
聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?
|
4月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
【7月更文挑战第19天】Python Web中间件摘要:**中间件是扩展框架功能的关键组件,它拦截并处理请求与响应。在Flask中,通过`before_request`和`after_request`装饰器模拟中间件行为;Django则有官方中间件系统,需实现如`process_request`和`process_response`等方法。中间件用于日志、验证等场景,但应考虑性能、执行顺序、错误处理和代码可维护性。
79 0
|
6月前
|
存储 缓存 监控
中间件Read-Through Cache(直读缓存)策略实现方式
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略实现方式
78 4
中间件Read-Through Cache(直读缓存)策略实现方式
|
6月前
|
缓存 中间件 数据库
中间件Write-Through Cache(直写缓存)策略
【5月更文挑战第7天】中间件Write-Through Cache(直写缓存)策略
94 4
中间件Write-Through Cache(直写缓存)策略
|
6月前
|
缓存 算法 NoSQL
中间件Cache-Aside策略命中缓存
【5月更文挑战第10天】中间件Cache-Aside策略命中缓存
77 8