深度解读.NET 5授权中间件的执行策略
前文提要
2021.1月份我寫了一個《這難道不是.NET5 的bug? 在線求錘?》,
講述了我在實現[全局授權訪問+特例匿名訪問] 遇到的技術困惑:? ? [特例匿名訪問,怎么走了認證流程?]。
博客園上某大佬的看法:
大概的意思是說 :不管是匿名訪問還是鑒權訪問,均先識別用戶身份,再決定跳過授權/應用授權![有身份訪問 MVC Login]這個場景可以佐證這個看法。
頭腦風暴
后來我又仔細檢視看了授權的源代碼,發現并不完整, 請看官仔細觀察我原文的示例,
端點路由還有一個[健康檢查],端點加上了[AllowAnonymous]
這個端點并沒有進入認證流程,從授權中間件源碼上看也是如此。
故官方源碼是否能進入認證邏輯:關鍵是看端點上是否包含授權策略:
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授權中間件的流程是這樣的:
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 放在授權的范疇。? ?
>??Authorization components, including the AuthorizeAttribute and AllowAnonymousAttribute attributes, are found in the Microsoft.AspNetCore.Authorization namespace.
就這樣吧, 匿名訪問不表示"無需認證";匿名訪問是"授權" 的控制范疇;? ??授權的前提是先認證。
Ref:
這難道不是.NET5的bug? 在線求錘?
2021年了,`IEnumerator`、`IEnumerable`接口還傻傻分不清楚?
ASP.NET Core Middleware抽絲剝繭
一套標準的ASP.NET Core容器化應用日志收集分析方案
吐槽一下Abp的用戶和租戶管理模塊
ASP.NET Core端點路由作用原理
總結
以上是生活随笔為你收集整理的深度解读.NET 5授权中间件的执行策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用 Entity Framewor
- 下一篇: EFCore查缺补漏(一):依赖注入