zoukankan      html  css  js  c++  java
  • ASP.NET Core利用拦截器 IActionFilter实现权限控制

    麦荻网教系统”采用了前后端代码分离的架构,即“Miidy.Cloud.Console”站与“Miidy.Cloud.Manage”站(两个前端站)同时通过web api的方式调用“Miidy.Cloud.RestWeb” web服务,以达到前后端代码分离的方式(详情请查看麦荻网教系统的安装部署文档)。因为“Miidy.Cloud.Manage”站只开放给具备管理权限的用户,故除了在前端增加控制外,还需在“Miidy.Cloud.RestWeb” web服务内进行权限控制。那么,如何在“Miidy.Cloud.RestWeb” web服务内根据用户实现权限控制呢?

    IActionFilter

    在“Miidy.Cloud.RestWeb”程序内,我们将借助IActionFilter接口来实现请求的拦截。该接口提供了两个方法(官网文档)分别为:OnActionExecuted(Action执行后)、OnActionExecuting(Action执行前)。根据需求,我们实现OnActionExecuting即可。

    Attribute

    我们再借助“Attribute”属性特性,可帮助我们在“Miidy.Cloud.RestWeb”指定的方法内按需使用拦截器,这样便可很方便的达到权限控制的目的。

    实现

    如上面所述,我们已经清楚了整个实现思路,那么下面就来看看“Miidy.Cloud.RestWeb”程序拦截器的代码实现吧:

    1、首先我们先创建一个名为“ManageVerifyAttribute”的拦截器类,命名以“Attribute”结尾,并继承“Attribute”类,与实现“IActionFilter”。并在OnActionExecuting方法内写入业务代码。具体代码如下:

      1 
      2 namespace Miidy.Cloud.Provider
      3 {
      4     /// <summary>
      5     /// 该过虑器提供给所有对外的RestApi接口使用
      6     /// 在有需要验证每个接口/方法是否只为管理人员用户调用时使用
      7     /// 方法级别的过率器
      8     /// </summary>
      9     public class ManageVerifyAttribute : Attribute, IActionFilter
     10     {
     11         public void OnActionExecuted(ActionExecutedContext context)
     12         {
     13         }
     14 
     15         /// <summary>
     16         /// 判断用户是否为管理角色,不是则抛出异常
     17         /// </summary>
     18         /// <param name="context"></param>
     19         public void OnActionExecuting(ActionExecutingContext context)
     20         {
     21             if (context.HttpContext.User.Identity.IsAuthenticated)
     22             {
     23                 var roleType = int.Parse(context.HttpContext.User.Claims.First(c => c.Type == "roleType").Value);
     24                 //不是管理人员
     25                 if (roleType <= 0 || roleType >= 4)
     26                 {
     27                     context.Result = new JsonResult(new Result(214));
     28                 }
     29             }
     30             else
     31                 context.Result = new JsonResult(new Result(214));
     32         }
     33 
     34     }
     35 }
     36 

    2、在Web Api的方法内打上[ManageVerify]属性,即可完成拦截器的功能实现了,具体如下:

      1 
      2 /// <summary>
      3 /// 同步单个数据,数据不存在则增加,否则修改
      4 /// </summary>
      5 /// <param name="ids"></param>
      6 /// <returns></returns>
      7 [Route("SynchrDataByModel")]
      8 [HttpPost]
      9 [ManageVerify]
     10 public async Task<Result> SynchrDataByModel(MC_Ware model)
     11 {
     12     var resul = await _WareCore.SynchrDataAsync(new List<MC_Ware> { model });
     13     if (resul <= 0)
     14         return new Result(211);
     15     return new Result(200);
     16 }

    总结

    1、基于“IActionFilter”接口来实现请求的拦截。

    2、基于“Attribute”属性特性可帮助我们可以按需在指定WebApi方法内使用拦截器。

    声明

    本文为作者原创,转载请备注出处与保留原文地址,谢谢。如文章能给您带来帮助,请点下推荐或关注,感谢您的支持!

  • 相关阅读:
    牛人的博客,备忘
    dev gridlookupedit
    Oracle with as 用法
    动态加载DLL对接第三方接口
    Oracle执行计划不稳定
    JAVA Cannot find class [×××] for bean with name '××' defined in class path resource [×××] 问题解决方法
    JAVA B/S通过摄像头采集图片信息解决方案。
    使控件悬浮在页面上不随滚动条变化的JQUERY插件
    原生态水平和垂直拉伸的JQUERY插件
    javascript实现继承的类
  • 原文地址:https://www.cnblogs.com/Miidy/p/11176614.html
Copyright © 2011-2022 走看看