成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET Core授權失敗如何自定義響應信息?

開發 后端
本文我們來看看在.NET 5中為何要出現針對授權失敗的中間件接口?它是如何一步步衍生出來的呢?以及 對于授權失敗根據實際需要如何自定義響應錯誤,以及如何獲取對應路由信息等等。

 [[410575]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky。轉載本文請聯系JeffckyShare公眾號。

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

授權失敗自定義響應信息

如下是在.NET 5之前,對于授權處理,我們大多實現自定義的AuthorizationHandler

  1. public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement> 
  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.     } 

但此時參數給予的是授權上下文,我們并不能拿到當前請求上下文中的相關信息,如果是在mvc中,想必大多是如下這般獲取的

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

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

  1. public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement> 
  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.         // 授權失敗響應信息 
  12.         await httpContext.Response.WriteAsync("授權失敗"); 
  13.  
  14.         //響應失敗調用 
  15.         context.Fail(); 
  16.  
  17.     } 

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

從.NET Core 3.0+上,官方開放針對上下文的擴展方法,提供給我們獲取路由節點元數據詳細信息

在該終結點類存在一個元數據屬性,該屬性為集合,該元數據包含任何你想要的東東

這里必須強調一下,我最喜愛.NET Core的一點是,很多時候我們會封裝類庫,并在類庫中使用到Web APi中相關的上下文一切信息等等,如果是以前.NET Framework怕是有點麻煩

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

在.NET Core類庫中要實現.NET Core相關基礎框架信息,只需要在類庫項目文件中引入支持.NET Core應用程序包包即可,如此才和當前應用程序版本完全一致

  1. <ItemGroup> 
  2.    <FrameworkReference Include="Microsoft.AspNetCore.App" /> 
  3.  </ItemGroup> 

 

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

  1. public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement> 
  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.     } 

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

這個時候,經過開發者在github上激烈的反饋,官方在.NET 5給出了,針對授權處理的中間件接口,上下文也已直接對外暴露

  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\":\"您暫無足夠的權限執行該操作\"}}"); 
  26.             return
  27.         } 
  28.         await next(context); 
  29.     } 

自從.NET 5提供給了我們授權中間件接口,一切又是那么得心應手!

 

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2021-08-09 10:31:33

自定義授權響應

2009-09-03 13:34:03

.NET自定義控件

2024-04-02 09:52:12

自定義返回類API開發

2009-07-06 13:49:29

2013-06-27 11:10:01

iOS開發自定義UISlider

2021-07-06 23:48:45

.NET用戶信息

2009-08-06 17:13:56

ASP.NET自定義控

2009-08-04 13:35:16

ASP.NET自定義樣

2009-11-12 16:14:28

ADO.NET自定義對

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-10 14:16:59

ASP.NET自定義控

2023-12-28 08:22:33

響應數據轉換

2009-09-07 22:00:15

LINQ自定義

2010-02-07 14:02:16

Android 界面

2010-01-18 15:43:35

VB.NET自定義屬性

2009-07-31 10:23:09

ASP.NET源碼DateTimePic

2010-01-15 15:26:46

VB.NET自定義類型

2009-07-20 13:47:08

iBATIS.NET字

2009-11-24 15:11:21

ASP.NET MVC

2009-08-12 14:38:05

ASP.NET Dat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线一区二区 | 日韩在线观看中文字幕 | 久久精品91 | 亚洲欧美日韩精品久久亚洲区 | 99亚洲综合 | 华人黄网站大全 | 自拍在线 | 亚洲男人的天堂网站 | 国产精品精品久久久 | 91tv在线观看 | 精品国产精品一区二区夜夜嗨 | 中文字幕一区在线 | 国产精品欧美一区二区三区 | 国产精品99久久久久久动医院 | 国外成人在线视频 | 欧美一区二区网站 | 国产精品久久久久久久久久久免费看 | 久久久久久久一区二区三区 | 最新av中文字幕 | 精品九九在线 | 午夜精品影院 | 国产精品久久久久久久白浊 | 精品少妇v888av | 欧美日韩中文在线 | 99精品久久 | 国产精品久久毛片av大全日韩 | 91精品久久久久久久久久 | 精品三级在线观看 | 午夜精品一区二区三区在线观看 | 精品成人一区二区 | 国产精品久久久久久久久久了 | 9191在线观看 | 国产免费va| 国产一区二区三区久久久久久久久 | 天天躁日日躁aaaa视频 | 日韩毛片免费看 | 亚洲成人免费视频在线 | 精品中文字幕在线 | 久久久久久毛片免费观看 | 欧美日韩亚洲一区 | 91在线观看视频 |