日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
.NETCore授權(quán)失敗如何自定義響應(yīng)信息?

本文轉(zhuǎn)載自微信公眾號「JeffckyShare」,作者Jeffcky。轉(zhuǎn)載本文請聯(lián)系JeffckyShare公眾號。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),仁布企業(yè)網(wǎng)站建設(shè),仁布品牌網(wǎng)站建設(shè),網(wǎng)站定制,仁布網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,仁布網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

本文我們來看看在.NET 5中為何要出現(xiàn)針對授權(quán)失敗的中間件接口?它是如何一步步衍生出來的呢?以及 對于授權(quán)失敗根據(jù)實(shí)際需要如何自定義響應(yīng)錯誤,以及如何獲取對應(yīng)路由信息等等

授權(quán)失敗自定義響應(yīng)信息

如下是在.NET 5之前,對于授權(quán)處理,我們大多實(shí)現(xiàn)自定義的AuthorizationHandler

 
 
 
 
  1. public class CustomAuthorizeHandler : AuthorizationHandler 
  2.     protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement) 
  3.     { 
  4.         throw new NotImplementedException(); 
  5.     } 
  6.  
  7. public class CustomAuthorizationRequirement : IAuthorizationRequirement 
  8.     public CustomAuthorizationRequirement() 
  9.     { 
  10.     } 

但此時(shí)參數(shù)給予的是授權(quán)上下文,我們并不能拿到當(dāng)前請求上下文中的相關(guān)信息,如果是在mvc中,想必大多是如下這般獲取的

 
 
 
 
  1. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement) 
  2.     var context = context.Resource as HttpContext; 

但對于前后分離的web api中,若我沒記錯的話,這樣是獲取到的是空,于是乎我們借助于注入上下文接口實(shí)現(xiàn),演變成如下這樣

 
 
 
 
  1. public class CustomAuthorizeHandler : AuthorizationHandler 
  2.     private readonly IHttpContextAccessor _accessor; 
  3.     public CustomAuthorizeHandler(IHttpContextAccessor accessor) 
  4.     { 
  5.         _accessor = accessor; 
  6.     } 
  7.     protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement) 
  8.     { 
  9.         var httpContext = _accessor.HttpContext; 
  10.  
  11.         // 授權(quán)失敗響應(yīng)信息 
  12.         await httpContext.Response.WriteAsync("授權(quán)失敗"); 
  13.  
  14.         //響應(yīng)失敗調(diào)用 
  15.         context.Fail(); 
  16.  
  17.     } 

通過上下文可以拿到比如用戶聲明信息等等,貌似已經(jīng)基本滿足我們實(shí)際業(yè)務(wù)需求,那要是我想獲取路由信息又該如何呢?在3.0以下貌似只能通過Path自己解析(個人猜測)

從.NET Core 3.0+上,官方開放針對上下文的擴(kuò)展方法,提供給我們獲取路由節(jié)點(diǎn)元數(shù)據(jù)詳細(xì)信息

在該終結(jié)點(diǎn)類存在一個元數(shù)據(jù)屬性,該屬性為集合,該元數(shù)據(jù)包含任何你想要的東東

這里必須強(qiáng)調(diào)一下,我最喜愛.NET Core的一點(diǎn)是,很多時(shí)候我們會封裝類庫,并在類庫中使用到Web APi中相關(guān)的上下文一切信息等等,如果是以前.NET Framework怕是有點(diǎn)麻煩

比如如上在類庫中獲取上下文接口,如果你還是延續(xù)舊思想,查看vs智能提示你是否需要安裝包,你會發(fā)現(xiàn)在Web APi中版本和你安裝的版本是對應(yīng)不上的,這可能是有問題的哈(具體細(xì)節(jié)我并未深入探究),但實(shí)際上我想安裝的是.NET 5

在.NET Core類庫中要實(shí)現(xiàn).NET Core相關(guān)基礎(chǔ)框架信息,只需要在類庫項(xiàng)目文件中引入支持.NET Core應(yīng)用程序包包即可,如此才和當(dāng)前應(yīng)用程序版本完全一致

 
 
 
 
  1.  
  2.     
  3.   

面向不同群體讀者,這里重點(diǎn)強(qiáng)調(diào)下,以免初學(xué).NET Core童鞋路走偏了!話題扯遠(yuǎn)了,比如如上述我們想要獲取到元數(shù)據(jù)中的控制器和action名稱,該元數(shù)據(jù)集合參數(shù)都是object,所以我們想要對應(yīng)的信息,需要稍微清楚一點(diǎn).NET Core基本流程處理所提供的各個對象

 
 
 
 
  1. public class CustomAuthorizeHandler : AuthorizationHandler 
  2.     private readonly IHttpContextAccessor _accessor; 
  3.     public CustomAuthorizeHandler(IHttpContextAccessor accessor) 
  4.     { 
  5.         _accessor = accessor; 
  6.     } 
  7.     protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement) 
  8.     { 
  9.         var httpContext = _accessor.HttpContext; 
  10.  
  11.         var endPoint = httpContext.GetEndpoint(); 
  12.  
  13.         var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata 
  14.             .ToList().FirstOrDefault(d => d is ControllerActionDescriptor); 
  15.  
  16.         var controllerName = controllerActionDescriptor.ControllerName; 
  17.  
  18.         var actionName = controllerActionDescriptor.ActionName; 
  19.  
  20.     } 

講到這里,實(shí)現(xiàn)對應(yīng)抽象授權(quán)處理對象,基本上可滿足我們的需求,即使上述拿到上下文并響應(yīng),但是在接口響應(yīng)上我們是獲取不到的,因?yàn)槭跈?quán)上下文,只提供Fail和Succeed方法,要是我們想根據(jù)業(yè)務(wù)失敗后直接響應(yīng)呢?所以最大的問題出在:我們無法完全控制響應(yīng),以及自定義響應(yīng)

這個時(shí)候,經(jīng)過開發(fā)者在github上激烈的反饋,官方在.NET 5給出了,針對授權(quán)處理的中間件接口,上下文也已直接對外暴露

 
 
 
 
  1. public class CustomAuthorizationMiddlewareResultHandler 
  2.         : IAuthorizationMiddlewareResultHandler 
  3.  
  4.     public async Task HandleAsync(RequestDelegate next, 
  5.       HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult) 
  6.     { 
  7.         var endPoint = context.GetEndpoint(); 
  8.  
  9.         var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata 
  10.           .ToList().FirstOrDefault(d => d is ControllerActionDescriptor); 
  11.  
  12.         var controllerName = controllerActionDescriptor.ControllerName; 
  13.  
  14.         var actionName = controllerActionDescriptor.ActionName; 
  15.  
  16.         if (!context.User.Identity.IsAuthenticated) 
  17.         { 
  18.             context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
  19.             await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":401,\"message\":\"登錄已過期,請重新登錄\"}}"); 
  20.             return; 
  21.         } 
  22.         else if (!await HandleRequirementEvaluateAsync(context.User, controllerName, actionName)) 
  23.         { 
  24.             context.Response.StatusCode = (int)HttpStatusCode.Forbidden; 
  25.             await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":403,\"message\":\"您暫無足夠的權(quán)限執(zhí)行該操作\"}}"); 
  26.             return; 
  27.         } 
  28.         await next(context); 
  29.     } 

自從.NET 5提供給了我們授權(quán)中間件接口,一切又是那么得心應(yīng)手!


網(wǎng)站名稱:.NETCore授權(quán)失敗如何自定義響應(yīng)信息?
文章網(wǎng)址:http://www.dlmjj.cn/article/cdjpeej.html