.NetCore 下開發獨立的(RPL)含有界面的組件包 (一)準備工做 html
.NetCore 下開發獨立的(RPL)含有界面的組件包 (二)擴展中間件及服 務安全
.NetCore 下開發獨立的(RPL)含有界面的組件包 (三)構建界面 ide
.NetCore 下開發獨立的(RPL)含有界面的組件包 (四)受權過濾 測試
.NetCore 下開發獨立的(RPL)含有界面的組件包 (五)受權過濾參數處 理spa
.NetCore 下開發獨立的(RPL)含有界面的組件包 (六)實現業務功能 code
前面一篇中處理受權類,可是不難發現咱們時間上處理業務也是難以擴展,爲了作到更好的擴展,我這裏須要加入一些參數來作處理,加入什麼參數合適呢?orm
其實在中間件中有 上下文對象 HttpContext,有了這個類咱們能作的事情就多了,獲取Request 、Response以及RequestServices ,獲取DI中註冊的服務操做本身的業務作驗證htm
那麼怎麼來處理這個類呢?中間件
是否是直接把HttpContext直接傳過去呢? 其實也是能夠的,可是爲了安全不暴露一些沒必要要的操做以及設置對一些屬性擴展,咱們封裝了對一個包裝類來從新構造一個密封的中間件上下文對象對象
internal sealed class AdminChinaDashboardContext : DashboardContext { public AdminChinaDashboardContext(HttpContext httpContext) : base() { if (httpContext == null) throw new ArgumentNullException(nameof(httpContext)); HttpContext = httpContext; DashboardRequest = new DashboardRequest(httpContext); DashboardResponse = new DashboardResponse(httpContext); DashboardRequestServices = httpContext.RequestServices; } public HttpContext HttpContext { get; } }
public class DashboardContext { public IServiceProvider DashboardRequestServices{ get; protected set; } public DashboardAbstractRequest DashboardRequest { get; set; } public DashboardAbstractResponse DashboardResponse { get; set; } }
DashboardRequest、DashboardResponse 對抽象的對於類重寫下某些須要的方法便可,好比獲取參數之類的(Query & Form) 其餘代碼略了
這裏DashboardContext 做爲參數,對外只暴露抽象類提供的一些操做,接下來咱們來修改下代碼
首先是中間件的地方咱們須要把HttpContext傳遞過去,包裝好一個新的DashboardContext中的對象幾個運行外部訪問的屬性
if (_options.Authorization.Any(auth => !auth.IsAuthorize(new AdminChinaDashboardContext(context)))) { context.Response.ContentType = "text/html; charset=utf-8"; await context.Response.WriteAsync("這是沒有受權的頁面"); return; }
而後是在實現的受權過濾器裏面處理下
public class CustomAuthorizeFilter : IDashboardAuthorizationFilter { public bool IsAuthorize(DashboardContext context) { return true; } }
咱們能夠經過上下問對象請求處理,以及獲取DI的服務操做
最後咱們來繼續修改代碼,淡然你而已獲取DI服務,以下面註釋的代碼同樣,根據你本身的業務處理,這裏我寫了一個GetQuery方法根據參數測試一下,參數值爲admin及可受權
public bool IsAuthorize(DashboardContext context) { // XXServices xX= context.DashboardRequestServices.GetService(typeof(IXXServices)); string testval = string.Empty; try { testval = context.DashboardRequest.GetQuery("test").Trim(); } catch { return false; } if (testval == "admin") return true; else return false; }
訪問中間件地址,在不輸入以及輸入其餘參數的狀況下都是沒有受權的處理
只有當咱們的地址輸入了admin參數值後,中間件纔會有做用