8

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

 3 years ago
source link: http://netsecurity.51cto.com/art/202102/644565.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

fAVrMrm.jpg!mobile

前文提要

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

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

博客园上某大佬的看法:

ZZ7fyy2.jpg!mobile

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

3umEvqZ.jpg!mobile

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上附加的特性 & 全局附加的过滤器)

JrqaqeY.jpg!mobile

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

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK