本文转载自微信公众号「全栈码农画像」,作者小码甲。转载本文请联系全栈码农画像微信官方账号。
前文提要
2021.1我在月份写了一篇《这不是吗?.NET5 的bug? 在线求锤,
它讲述了我在实现[全局授权访问 匿名访问] 遇到的技术困惑: [匿名访问,如何通过认证过程?
博客园某大佬的看法:
大致意思是 :无论是匿名访问还是鉴权访问,都要先识别用户身份,再决定跳过授权/应用授权![身份访问 MVC Login]这一幕可以证明这一观点。
头脑风暴
后来,我仔细检查了授权的源代码,发现它不完整。请仔细观察我原文的示例,
还有一个端点路由[健康检查],加上端点[AllowAnonymous]
从授权中间件源代码的角度来看,该端点尚未进入认证流程。
因此,官方源代码能否进入认证逻辑:关键是看终点是否包含授权策略:
直接应用健康检查端点[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:
(直接附加在端点的声明信息 & MVC附加特性 & 全局附加过滤器)
确实有不同的设计策略:
匿名优先:无需认证;
在身份登记的前提下,官方认定的匿名优先级是匿名访问。
也许我将”匿名优先“与“无需认证”联系在一起是不正确的。AllowAnonymous 属于授权范畴。
就这样吧,匿名访问并不意味着"无需认证";匿名访问是"授权" 控制范围; 授权的前提是先认证。