“麦荻网教系统”采用了前后端代码分离的架构,即“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方法内使用拦截器。

声明

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

转载于:https://www.cnblogs.com/Miidy/p/11176614.html

ASP.NET Core利用拦截器 IActionFilter实现权限控制相关推荐

  1. 拦截器,利用拦截器进行登陆权限控制

    拦截器,登录权限控制demo 1. 拦截器demo 2. 登录权限控制 地址: https://github.com/sevenyoungairye/spring-mvc-interceptor 1. ...

  2. SpringMVC拦截器-用户登录权限控制代码实现2

    在登陆页面输入用户名密码,点击登陆,通过用户名密码进行查询,如果登陆成功,则将用户信息实体存入session,然后跳转到首页,如果登陆失败则继续回到登陆页面 在UserController中编写登陆逻 ...

  3. SpringMVC拦截器-用户登录权限控制代码实现1

    判断用户是否登录 本质:判断session中有没有user,如果没有登陆则先去登陆,如果已经登陆则直接放行访问目标资源 先编写拦截器如下: public class PrivilegeIntercep ...

  4. struts2如何使用拦截器进行用户权限控制

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...

  5. SpringMVC拦截器-用户登录权限控制代码实现3

    JdbcTemplate.queryForObject对象如果查询不到数据会抛异常,导致程序无法达到预期效果,如何来解决该问题? 在业务层处理来自dao层的异常,如果出现异常service层返回nul ...

  6. 基于三段式命令及筛选器的rbac权限控制方案

    引用自 摸鱼wiki,点击可查看原文 1. 权限命令的表示 1.1 权限命令 采用三段式设计,将命令划分为类型.操作.属性/对象三个层级.相较于采用常量声明,这样的写法可以支持使用通配符进行设置,减少 ...

  7. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

    前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...

  8. Flume下读取kafka数据后再打把数据输出到kafka,利用拦截器解决topic覆盖问题

    1:如果在一个Flume Agent中同时使用Kafka Source和Kafka Sink来处理events,便会遇到Kafka Topic覆盖问题,具体表现为,Kafka Source可以正常从指 ...

  9. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

    一步一步指导您使用 ElasticSearch, Kibana, ASP.NET Core 2.1 和 Docker 来记录日志 在本教程中,我将向您展示如何启动和运行 ElasticSearch,K ...

最新文章

  1. linux如何生成javacore文件,如何产生javacore和heapdump文件》
  2. url主机域名可以省略_网站迁移虚拟主机怎么样能不影响网站优化
  3. Redis进阶-lua脚本
  4. 2020-11-13(四大组件简单回忆内容)
  5. 使用SAP HANA Web-based Development Workbench进行SQLScript练习
  6. C语言中枚举enum的用法
  7. 联想超融合平台oracle,联想AIO超融合云一体机解决方案.pdf
  8. java死锁怎么用jvm调试,线程死锁演示,线程锁演示,模拟JVM的线程次序调度
  9. Safari技术预览版141来啦,增加了哪些新功能?
  10. 在真实数据集上的随机森林模型参数调优
  11. python - super 寻找继承关系
  12. DOM扩展-HTML5、专有扩展
  13. 「支持m1」命令行终端美化模拟器—Hyper for Mac
  14. Linux环境变量配置【转】
  15. VS2017离线安装过程及下载缓慢处理(项目打包部署)
  16. cad插件加载bplot成功用不了_CAD批量打印,加载Batchplot.vlx那个。 为什么我电脑输入BPLOT命令后没反应啊??急急急,求大神们解救!...
  17. window10使用bat脚本配置ip和dns
  18. 大数据时代的安全威胁
  19. Failed to load module “canberra-gtk-module“
  20. avr c语言编译器,[VR虚拟现实]AVR单片机C语言编译器.doc

热门文章

  1. Flask Jinja2 模板中的变量和过滤器
  2. 一道非常简单的签到题
  3. 北大核心期刊2012《科技通报》杂志简介《科技通报》论文范文
  4. 深度学习《残差网络简单学习》
  5. pytorch保存模型pth_pytorch中保存的模型文件.pth深入解析
  6. sql报表按月统计_用Excel如何对销售数据按月分别统计成本,销售额以及利润?...
  7. Linux和Windows下计算文件的Hash值
  8. toj 4615 Tetrahedrons and Spheres
  9. vcenter6.7许可证企业版_本地的公司看过来,增值电信业务许可证如何办理!
  10. jboss怎么连接Oracle数据库,如何在Jboss中配置数据源