新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)「全棧碼農(nóng)畫像」,作者小碼甲。轉(zhuǎn)載本文請(qǐng)聯(lián)系全棧碼農(nóng)畫像公眾號(hào)。

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、淮安區(qū)ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的淮安區(qū)網(wǎng)站制作公司
前文提要
2021.1月份我寫了一個(gè)《這難道不是.NET5 的bug? 在線求錘?》,
講述了我在實(shí)現(xiàn)[全局授權(quán)訪問+特例匿名訪問] 遇到的技術(shù)困惑: [特例匿名訪問,怎么走了認(rèn)證流程?]。
博客園上某大佬的看法:
大概的意思是說 :不管是匿名訪問還是鑒權(quán)訪問,均先識(shí)別用戶身份,再?zèng)Q定跳過授權(quán)/應(yīng)用授權(quán)![有身份訪問 MVC Login]這個(gè)場(chǎng)景可以佐證這個(gè)看法。
頭腦風(fēng)暴
后來我又仔細(xì)檢視看了授權(quán)的源代碼,發(fā)現(xiàn)并不完整, 請(qǐng)看官仔細(xì)觀察我原文的示例,
端點(diǎn)路由還有一個(gè)[健康檢查],端點(diǎn)加上了[AllowAnonymous]
- endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz");
這個(gè)端點(diǎn)并沒有進(jìn)入認(rèn)證流程,從授權(quán)中間件源碼上看也是如此。
故官方源碼是否能進(jìn)入認(rèn)證邏輯:關(guān)鍵是看端點(diǎn)上是否包含授權(quán)策略:
- var authorizeData = endpoint?.Metadata.GetOrderedMetadata
() ?? Array.Empty (); - var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData);
- if (policy == null)
- {
- await _next(context);
- return;
- }
健康檢查端點(diǎn)直接應(yīng)用了[AllowAnonymous](實(shí)際上你可以不加), 這樣就沒有授權(quán)策略(policy= null),這個(gè)時(shí)候自然跳過后續(xù),進(jìn)入業(yè)務(wù)邏輯。
甚至, 你可以這樣寫:endpoints.MapControllers().RequireAuthorization().AllowAnonymous().WithDisplayName("default");
這樣的代碼也要進(jìn)入認(rèn)證邏輯,因?yàn)樗耸跈?quán)聲明。
根據(jù)以上分析,.NET 5授權(quán)中間件的流程是這樣的:
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.
授權(quán)是正交的并且獨(dú)立于驗(yàn)證。但是,授權(quán)需要身份驗(yàn)證機(jī)制。身份驗(yàn)證是確定用戶身份的過程。認(rèn)證可以為當(dāng)前用戶創(chuàng)建一個(gè)或多個(gè)身份。
思緒整理
我試圖以一種流暢的、能自然其說的思路來理解官方的設(shè)計(jì)理念。
我們捋一捋:
當(dāng)我“樸素的需求”到達(dá)端點(diǎn)時(shí),端點(diǎn)第一時(shí)間拿到平鋪的所有元數(shù)據(jù)metadata:
(直接附加在端點(diǎn)上的聲明信息 & MVC上附加的特性 & 全局附加的過濾器)
針對(duì)這種矛盾體元數(shù)據(jù), 確實(shí)有不同的設(shè)計(jì)策略:
我理解的匿名優(yōu)先:不需要認(rèn)證;
官方認(rèn)定的匿名優(yōu)先,是在身份登記的前提下,匿名訪問優(yōu)先。
也許我將”匿名優(yōu)先“與“無需認(rèn)證”聯(lián)系在一起,并不正確。 官方可是將AllowAnonymous 放在授權(quán)的范疇。
- > Authorization components, including the AuthorizeAttribute and AllowAnonymousAttribute attributes, are found in the Microsoft.AspNetCore.Authorization namespace.
就這樣吧, 匿名訪問不表示"無需認(rèn)證";匿名訪問是"授權(quán)" 的控制范疇; 授權(quán)的前提是先認(rèn)證。
文章標(biāo)題:深度解讀.NET5授權(quán)中間件的執(zhí)行策略
網(wǎng)頁地址:http://www.5511xx.com/article/cddgogi.html


咨詢
建站咨詢
