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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2023/12/4 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这难道不是.NET5的bug? 在线求锤? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hello,最近在對一個使用.NET5項目的認證授權系統進行重構,對.NET 5的授權中間件的源碼有些看法。也希望同學們能幫我理解。

一個樸素的需求

這是一個api項目,默認所有的api都需要授權, 少量散落在Controller各處的api不需要授權訪問,故這里有個全局授權訪問+特例匿名訪問的矛盾

以我粗鄙的想法,我相信.NET會很好的處理好這個矛盾:[AllowAnonymous]優先

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


需求實現

在Startup ConfigureServices添加認證、授權服務

??//??認證服務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();});//?授權服務 services.AddAuthorization(options?=>{//?默認策略options.DefaultPolicy?=?new?AuthorizationPolicyBuilder().RequireAuthenticatedUser().AddAuthenticationSchemes("token").Build(); });

既然現在.NET5推薦使用端點路由的形式,故針對我這個樸素的需求:

我理所當然會嘗試使用在Controller端點上要求全局授權訪問,對散落在各地的不需要授權的Controller添加[AllowAnonymous]特性。

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

實際測試發現,雖然我對Controller標記了允許匿名訪問, 但請求始終進入了授權認證過程!這個樸素的授權需求竟然還遇到了障礙。

探究源碼

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

源碼很簡單:

1. .NET 授權中間件先從端點獲取了全局授權聲明IAuthorizeData
2. 通過這個聲明拿到了詳細的全局授權策略
3. 后面直接開始走授權認證過程?????? ? 難以理解
4. 雖然后面又開始檢測Controller-Action上面的AllowAnonymous特性,這時候已經晚了,你都把授權認證流程都走一遍了!!

很明顯,基于端點的全局授權+零散的匿名訪問特性 并沒有貫徹[AllowAnonymous]特性優先的原則。

在這個測試例子中,當前端點的metadata確實包含Authorize和AllowAnonymous兩個特性!

后續

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

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

暫時采用變通方案:我自行寫了一個授權中間件(主體拷貝自官方), 自行將對[AllowAnonymous]特性的檢測應用代碼提到端點授權代碼的前面, 這也是我內心認為的bug修復方案。

歡迎大家留言,提出意見或看法!

更多干貨及最佳實踐分享
關注并星標我們~。。~

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。