日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

这难道不是.NET5的bug? 在线求锤?

發(fā)布時(shí)間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这难道不是.NET5的bug? 在线求锤? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

hello,最近在對(duì)一個(gè)使用.NET5項(xiàng)目的認(rèn)證授權(quán)系統(tǒng)進(jìn)行重構(gòu),對(duì).NET 5的授權(quán)中間件的源碼有些看法。也希望同學(xué)們能幫我理解。

一個(gè)樸素的需求

這是一個(gè)api項(xiàng)目,默認(rèn)所有的api都需要授權(quán), 少量散落在Controller各處的api不需要授權(quán)訪問(wèn),故這里有個(gè)全局授權(quán)訪問(wèn)+特例匿名訪問(wèn)的矛盾

以我粗鄙的想法,我相信.NET會(huì)很好的處理好這個(gè)矛盾:[AllowAnonymous]優(yōu)先

這個(gè)想法在https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple?view=aspnetcore-5.0 得到印證


需求實(shí)現(xiàn)

在Startup ConfigureServices添加認(rèn)證、授權(quán)服務(wù)

??//??認(rèn)證服務(wù)services.AddAuthentication("token").AddScheme<TokenAuthenticationOptions,?TokenAuthenticationHandler>(TokenAuthenticationDefaults.AuthenticationScheme,option?=>?{option.ClaimsIssuer?=?configuration.GetSection("AppKeys")["ClaimsIssuer"].ToString();option.ClientId?=?configuration.GetSection("AppKeys")["ClientId"].ToString();option.ClientSign?=?configuration.GetSection("AppKeys")["ClientSign"].ToString();});//?授權(quán)服務(wù) services.AddAuthorization(options?=>{//?默認(rèn)策略options.DefaultPolicy?=?new?AuthorizationPolicyBuilder().RequireAuthenticatedUser().AddAuthenticationSchemes("token").Build(); });

既然現(xiàn)在.NET5推薦使用端點(diǎn)路由的形式,故針對(duì)我這個(gè)樸素的需求:

我理所當(dāng)然會(huì)嘗試使用在Controller端點(diǎn)上要求全局授權(quán)訪問(wèn),對(duì)散落在各地的不需要授權(quán)的Controller添加[AllowAnonymous]特性。

?//?注冊(cè)授權(quán)中間件app.UseAuthorization();app.UseEndpoints(endpoints?=>{endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz");??????????????????//?全局對(duì)所有api要求授權(quán)訪問(wèn)endpoints.MapControllers().RequireAuthorization().WithDisplayName("default");}); [AllowAnonymous] [HttpGet] [Route("triggerorder")] public?void?TriggerOrder() {... }

實(shí)際測(cè)試發(fā)現(xiàn),雖然我對(duì)Controller標(biāo)記了允許匿名訪問(wèn), 但請(qǐng)求始終進(jìn)入了授權(quán)認(rèn)證過(guò)程!這個(gè)樸素的授權(quán)需求竟然還遇到了障礙。

探究源碼

授權(quán)中間件源碼在此:https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs

源碼很簡(jiǎn)單:

1. .NET 授權(quán)中間件先從端點(diǎn)獲取了全局授權(quán)聲明IAuthorizeData
2. 通過(guò)這個(gè)聲明拿到了詳細(xì)的全局授權(quán)策略
3. 后面直接開(kāi)始走授權(quán)認(rèn)證過(guò)程?????? ? 難以理解
4. 雖然后面又開(kāi)始檢測(cè)Controller-Action上面的AllowAnonymous特性,這時(shí)候已經(jīng)晚了,你都把授權(quán)認(rèn)證流程都走一遍了!!

很明顯,基于端點(diǎn)的全局授權(quán)+零散的匿名訪問(wèn)特性 并沒(méi)有貫徹[AllowAnonymous]特性優(yōu)先的原則。

在這個(gè)測(cè)試?yán)又?#xff0c;當(dāng)前端點(diǎn)的metadata確實(shí)包含Authorize和AllowAnonymous兩個(gè)特性!

后續(xù)

我在github上提了issue(https://github.com/dotnet/aspnetcore/issues/29377), 講述了這個(gè)樸素的需求面臨的障礙,但是官方的回答我并不滿意:

> [the current behavior is intentional?]? ?? [By Design]

暫時(shí)采用變通方案:我自行寫了一個(gè)授權(quán)中間件(主體拷貝自官方), 自行將對(duì)[AllowAnonymous]特性的檢測(cè)應(yīng)用代碼提到端點(diǎn)授權(quán)代碼的前面, 這也是我內(nèi)心認(rèn)為的bug修復(fù)方案。

歡迎大家留言,提出意見(jiàn)或看法!

更多干貨及最佳實(shí)踐分享
關(guān)注并星標(biāo)我們~。。~

總結(jié)

以上是生活随笔為你收集整理的这难道不是.NET5的bug? 在线求锤?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。