自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度解讀.NET 5授權(quán)中間件的執(zhí)行策略

安全 應(yīng)用安全
講述了我在實(shí)現(xiàn)[全局授權(quán)訪(fǎng)問(wèn)+特例匿名訪(fǎng)問(wèn)] 遇到的技術(shù)困惑: [特例匿名訪(fǎng)問(wèn),怎么走了認(rèn)證流程?]。

[[380455]]

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

前文提要

2021.1月份我寫(xiě)了一個(gè)《這難道不是.NET5 的bug? 在線(xiàn)求錘?》,

講述了我在實(shí)現(xiàn)[全局授權(quán)訪(fǎng)問(wèn)+特例匿名訪(fǎng)問(wèn)] 遇到的技術(shù)困惑: [特例匿名訪(fǎng)問(wèn),怎么走了認(rèn)證流程?]。

博客園上某大佬的看法:

 

大概的意思是說(shuō) :不管是匿名訪(fǎng)問(wèn)還是鑒權(quán)訪(fǎng)問(wèn),均先識(shí)別用戶(hù)身份,再?zèng)Q定跳過(guò)授權(quán)/應(yīng)用授權(quán)![有身份訪(fǎng)問(wèn) MVC Login]這個(gè)場(chǎng)景可以佐證這個(gè)看法。

頭腦風(fēng)暴

后來(lái)我又仔細(xì)檢視看了授權(quán)的源代碼,發(fā)現(xiàn)并不完整, 請(qǐng)看官仔細(xì)觀(guān)察我原文的示例,

端點(diǎn)路由還有一個(gè)[健康檢查],端點(diǎn)加上了[AllowAnonymous]

  1. endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz"); 

這個(gè)端點(diǎn)并沒(méi)有進(jìn)入認(rèn)證流程,從授權(quán)中間件源碼上看也是如此。

故官方源碼是否能進(jìn)入認(rèn)證邏輯:關(guān)鍵是看端點(diǎn)上是否包含授權(quán)策略:

  1. var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();    
  2.   var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData); 
  3.   if (policy == null
  4.  { 
  5.      await _next(context); 
  6.      return
  7.   } 

健康檢查端點(diǎn)直接應(yīng)用了[AllowAnonymous](實(shí)際上你可以不加), 這樣就沒(méi)有授權(quán)策略(policy= null),這個(gè)時(shí)候自然跳過(guò)后續(xù),進(jìn)入業(yè)務(wù)邏輯。

甚至, 你可以這樣寫(xiě):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)證是確定用戶(hù)身份的過(guò)程。認(rèn)證可以為當(dāng)前用戶(hù)創(chuàng)建一個(gè)或多個(gè)身份。

思緒整理

我試圖以一種流暢的、能自然其說(shuō)的思路來(lái)理解官方的設(shè)計(jì)理念。

我們捋一捋:

當(dāng)我“樸素的需求”到達(dá)端點(diǎn)時(shí),端點(diǎn)第一時(shí)間拿到平鋪的所有元數(shù)據(jù)metadata:

(直接附加在端點(diǎn)上的聲明信息 & MVC上附加的特性 & 全局附加的過(guò)濾器)

 

針對(duì)這種矛盾體元數(shù)據(jù), 確實(shí)有不同的設(shè)計(jì)策略:

我理解的匿名優(yōu)先:不需要認(rèn)證;

官方認(rèn)定的匿名優(yōu)先,是在身份登記的前提下,匿名訪(fǎng)問(wèn)優(yōu)先。

也許我將”匿名優(yōu)先“與“無(wú)需認(rèn)證”聯(lián)系在一起,并不正確。 官方可是將AllowAnonymous 放在授權(quán)的范疇。

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

就這樣吧, 匿名訪(fǎng)問(wèn)不表示"無(wú)需認(rèn)證";匿名訪(fǎng)問(wèn)是"授權(quán)" 的控制范疇; 授權(quán)的前提是先認(rèn)證。

 

責(zé)任編輯:武曉燕 來(lái)源: 全棧碼農(nóng)畫(huà)像
相關(guān)推薦

2016-11-11 21:00:46

中間件

2021-02-11 08:21:02

中間件開(kāi)發(fā)CRUD

2011-05-24 15:10:48

2018-07-29 12:27:30

云中間件云計(jì)算API

2018-02-01 10:19:22

中間件服務(wù)器系統(tǒng)

2019-08-12 08:00:00

ASP.NetASP.Net Cor編程語(yǔ)言

2015-02-07 21:52:45

PaaS中間件

2013-03-13 10:37:22

中間件Windows

2018-05-02 16:23:24

中間件RPC容器

2023-10-18 07:32:27

中間件技術(shù)HTTP請(qǐng)求

2018-07-25 19:44:27

數(shù)據(jù)庫(kù)MySQL中間件

2021-06-15 10:01:02

應(yīng)用系統(tǒng)軟件

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2009-06-16 15:55:06

JBoss企業(yè)中間件

2012-11-30 10:21:46

移動(dòng)中間件

2022-11-18 07:54:02

Go中間件項(xiàng)目

2024-07-12 08:19:53

2012-09-13 15:48:16

云計(jì)算中間件

2015-12-21 14:56:12

Go語(yǔ)言Http網(wǎng)絡(luò)協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)