.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参数值后,中间件才会有做用