本文转载自微信公众号《全栈码农画像》,作者小马甲。转载本文请联系全栈码农画像公众号。2021年1月,我写了一篇《这难道不是.NET5 的bug? 在线求锤?》,关于我在实现【全局授权访问+特例匿名访问】时遇到的技术困惑:【特例匿名访问,如何走鉴权流程?】。博客园某位大佬的意见:大致意思是:无论是匿名访问还是鉴权访问,先识别用户身份,再决定跳过授权/申请授权![AccessMVCLoginwithidentity]这个场景可以证明这个观点。脑洞大开后,仔细查看了授权的源代码,发现并不完整。请仔细看我原文中的例子。端点路由也有【健康检查】,端点添加【AllowAnonymous】endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz");这个端点并没有进入认证过程,从授权中间件的源码可以看出。所以官方源码能否进入认证逻辑:关键是看端点上是否包含授权策略:varauthorizeData=endpoint?.Metadata.GetOrderedMetadata()??Array.Empty();varpolicy=awaitAuthorizationPolicy.CombineAsync(_policyProvider,authorizeData);if(policy==null){await_next(context);return;}健康检查端点直接应用[AllowAnonymous](其实可以不加),所以没有授权策略(policy=null),这个时候自然跳过后续,进入业务逻辑。甚至,你可以这样写:endpoints.MapControllers().RequireAuthorization().AllowAnonymous().WithDisplayName("default");此类代码也进入身份验证逻辑,因为它包含授权语句。根据以上分析,.NET5授权中间件的流程如下:官方说:授权是正交的,独立于认证。但是,授权需要一种身份验证机制。身份验证是确定用户身份的过程。身份验证可以为当前用户创建一个或多个身份。授权是正交的并且独立于身份验证。但是,授权需要一种身份验证机制。身份验证是确定用户身份的过程。身份验证为当前用户创建一个或多个身份。思维有条理我试图以流畅自然的思维方式理解官方的设计理念。看一下:当我的“简单需求”到达端点时,端点立即获取了tile的所有元数据:(直接附加到端点的声明信息&MVC上的附加功能&全局附加过滤对于这个矛盾的主体元数据,有确实是不同的设计策略:我的理解是匿名优先:不需要认证;官方匿名优先,在身份注册的前提下,匿名访问优先。也许是我对“匿名优先”和“不需要认证”的联想是不正确的,官方把AllowAnonymous放在了授权范围内>授权组件,包括AuthorizeAttribute和AllowAnonymousAttribute属性,都在Microsoft.AspNetCore.Authorization命名空间中找到。就是这样,匿名访问不代表“不认证”;匿名访问是“授权”的控制类,授权的前提是authent离子第一。