这难道不是.NET5的bug? 在线求锤?
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)題。
- 上一篇: 洋哥!我要进大厂!
- 下一篇: asp.net ajax控件工具集 Au