效果图

没有登陆不会执行请求日期的方法,不管是否登陆都不允许访问请求时间方法

验证不通过是会进行转发到Home/error方法中,

代码附上:

    [Route("[controller]/[action]")]public class HomeController : BaseController{/// <summary>/// Ajax请求页面/// </summary>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>
        [HttpGet]public IActionResult AjaxView(){return View();}/// <summary>/// 登陆接口/// </summary>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>
        [HttpGet]public IActionResult Login(){LoginMember();return Json("登陆成功");}/// <summary>/// 清除登陆信息/// </summary>/// <returns></returns>
        [HttpGet]public IActionResult ClearLogin() {ClearMember();return Json("注销成功");}/// <summary>/// 登陆后也不能请求的接口/// </summary>/// <returns></returns>public IActionResult GetNoData(){return Json("时间是" + DateTime.Now.ToLongTimeString());}/// <summary>/// 请求数据接口/// </summary>/// <returns></returns>public IActionResult GetData() {return Json("今天是" + DateTime.Now.ToLongDateString());}/// <summary>/// 请求页面接口/// </summary>/// <returns></returns>public IActionResult GetDataView(){return View();}/// <summary>/// 请求不通过接口/// </summary>/// <returns></returns>public IActionResult Error(){return Json("你没有权限");}}

AjaxView视图页:
<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>AjaxView</title><script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script type="text/javascript" >$(function () {$("#Login").click(function () { $.get("/Home/Login", "", function (data) {alert(data);})})$("#ClearLogin").click(function () {$.get("/Home/ClearLogin", "", function (data) {alert(data);})})$("#Getdata").click(function () {$.get("/Home/GetData", "", function (data) {alert(data);})})$("#GetTime").click(function () {$.get("/Home/GetNoData", "", function (data) {alert(data);})})})</script>
</head>
<body><button id="Login">登陆</button><button id="ClearLogin">注销</button><button id="Getdata">请求日期</button><button id="GetTime">请求时间</button>
</body>
</html>

4个请求

支持类(用户类与权限类、枚举):
  /// <summary>/// 用户类/// </summary>public class Member {public string Name { get; set; }//允许请求的连接public IEnumerable<RightsManagement> RightsList { get; set; }}/// <summary>/// 权限类/// </summary>public class RightsManagement {public int ID { get; set; }/// <summary>/// 允许请求的路径/// </summary>public string AllowRequest { get; set; }}public enum ErrorEnum {/// <summary>/// 没有登陆/// </summary>NoLogin=1,/// <summary>/// 不允许访问/// </summary>NoAllow=2,/// <summary>/// 可以访问/// </summary>OK=3}

全局变量

  /// <summary>/// error 方法地址/// </summary>protected string ErrorAction { get; private set; } = "Error";/// <summary>/// error 方法地址/// </summary>protected string ErrorController { get; private set; } = "Home";/// <summary>/// 用户类 ,为了直观点就这样弄了/// </summary>protected static Member member { get; private set; }/// <summary>/// 所有人都能访问的接口,以下接口不会被拦截/// </summary>protected List<RightsManagement> RightsList { get; set; } = new List<RightsManagement>() {new RightsManagement(){ID=3,AllowRequest="Home/Login"},new RightsManagement(){ID=4,AllowRequest="Home/ClearLogin"},new RightsManagement(){ID=5,AllowRequest="Home/Error"},new RightsManagement(){ID=5,AllowRequest="Home/AjaxView"}};private ErrorEnum errorEnum;

登陆与注销函数
   /// <summary>/// 登陆函数/// </summary>public void LoginMember() {member = new Member(){Name = "张三",RightsList = new List<RightsManagement>() {new RightsManagement(){ID=1,AllowRequest="Home/GetData"//接口},new RightsManagement(){ID=2,AllowRequest="Home/GetDataView"//视图页}}};}/// <summary>/// 清除登陆信息/// </summary>public void ClearMember() {member = null;}

拦截器重写了父类的

OnActionExecutionAsync方法如果不是asp.net core 将不会有这个方法OnActionExecuting方法似乎无法决定控制器执行的方法,
   /// <summary>/// 请求开始前异步调用/// </summary>/// <param name="context">参数</param>/// <param name="next">一个已经封装好的委托</param>/// <returns></returns>public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){thecontext = context;//获取请求的路径 并进行拼接string theControllerAndAction = context.ActionDescriptor.RouteValues["controller"] + "/" + context.ActionDescriptor.RouteValues["action"];if (RightsList.Where(d=>d.AllowRequest== theControllerAndAction).Count()>0){//允许默认允许的请求通过return base.OnActionExecutionAsync(context, next);}//定义一个委托 用于表示next下一步执行的方法ActionExecutionDelegate thenext = new ActionExecutionDelegate(TaskOnActionExecutionAsync);if (member == null){//没有登陆errorEnum = ErrorEnum.NoLogin;}else {if (member.RightsList.Where(d => d.AllowRequest == theControllerAndAction).Count() == 0){//没有请求的权利errorEnum = ErrorEnum.NoAllow;}else {errorEnum = ErrorEnum.OK;//用base方法的去处理验证通过的请求,//因为我不知道转发请求的性能是否有额外开销return base.OnActionExecutionAsync(context, next);}}return base.OnActionExecutionAsync(context, thenext);}

Task 方法

  Task<ActionExecutedContext> TaskOnActionExecutionAsync() {Task<ActionExecutedContext> thetask = new Task<ActionExecutedContext>(funcOnActionExecutionAsync, thecontext);thetask.Start();return thetask;}//这是一个全局的临时变量,在控制器中 每次请求都会重置他  ActionExecutingContext thecontext;

funcOnActionExecutionAsync方法
 ActionExecutedContext funcOnActionExecutionAsync(object o) {ActionExecutingContext theaction = o as ActionExecutingContext;ActionExecutedContext theactionExecutedContext = new ActionExecutedContext(theaction, theaction.Filters, theaction.Controller);//表示跳过控制器方法访问直接返回数据给浏览器,也就是不跳转不进入控制器方法但是有异常信息返回//theaction.Result = Json("请求成功");switch (errorEnum){case ErrorEnum.NoLogin:            //theaction.Result =new RedirectResult("/Home/Error");进行重定向            theaction.Result = RedirectToAction(ErrorAction, ErrorController);
          break;case ErrorEnum.NoAllow:theaction.Result = RedirectToAction(ErrorAction, ErrorController);break;case ErrorEnum.OK:theaction.Result = RedirectToAction(theaction.ActionDescriptor.RouteValues["action"], theaction.ActionDescriptor.RouteValues["controller"]);break;default:break;}return theactionExecutedContext;}

OK 以上就是全部代码

其中可访问链接我是用list保存,也不知道有没有更好的方法。

Over

转载于:https://www.cnblogs.com/AnAng/p/8657447.html

asp.net core 拦击器制作的权限管理系统DEMO相关推荐

  1. asp.net core 使用 AccessControlHelper 控制访问权限

    asp.net core 使用 AccessControlHelper 控制访问权限 Intro 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权 ...

  2. Asp.Net Core 2.0 多角色权限认证

    在使用 WebForm 技术开发网站的时候,微软就提供了 Form 身份认证,这使得登录认证简单了许多,不同于 WebForm 以及后来的 Asp.Net Mvc,Asp.Net Core 中的身份认 ...

  3. [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(四.quartz 简单配置使用)...

    上一章介绍了log4net的简单配置,这一章介绍一下quartz的简单使用,下一章介绍一下我得权限使用,然后就结束 本章主要介绍: quartz在asp.net core中的使用 这个项目虽小,但是及 ...

  4. 权限管理系统demo(springboot+elementUI)内附部署到云服务器步骤

    目录 前言 环境和软件 目录结构 项目截图 购买云服务器 宝塔Linux面板(快速搭建) 部署项目到服务器上 安装软件 修改配置文件 生成jar包 上传jar包 打包前端代码 上传dist文件内容 配 ...

  5. asp.net core mvc权限控制:在视图中控制操作权限

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...

  6. ASP.NET Core 认证与授权[7]:动态授权

    基于资源的授权 有些场景下,授权需要依赖于要访问的资源,例如:每个资源通常会有一个创建者属性,我们只允许该资源的创建者才可以对其进行编辑,删除等操作,这就无法通过[Authorize]特性来指定授权了 ...

  7. ASP.NET Core 认证与授权[5]:初识授权

    经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...

  8. 从头编写 asp.net core 2.0 web api 基础框架 (2)

    上一篇是: 从头编写 asp.net core 2.0 web api 基础框架 (1) Github源码地址是: https://github.com/solenovex/Building-asp. ...

  9. 在ASP.NET Core上实施每个租户策略的数据库

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunnarpeipman.com/2017/08/da ...

最新文章

  1. FtpCopy数据定时自动备份软件(FTP定时备份)
  2. python中怎么创建配置文件_在Python中创建游戏配置/选项(config.cfg)文件
  3. css实现图片旋转,并设置旋转点
  4. php运行汇编,php脚本的执行过程(编译与执行相分离)
  5. 【clickhouse】clickhouse源码 Distributed之表select流程
  6. java ftp 大文件_用Java实现FTP批量大文件上传下载(二)
  7. WhatsApp被曝内部收集用户数据
  8. 【Java/Android性能优 7】Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类...
  9. LeetCode初级算法笔记整理
  10. Java JSP技术详解:(一)JSP 简介
  11. 关于Web网页设计规范简述
  12. Oracle数据库启动和关闭
  13. 【渝粤题库】陕西师范大学200081中国古代文学(一)作业(高起本、高起专)
  14. 5G中大规模MIMO系统通信的若干分析
  15. eclipse新建java项目报错 jrt-fs.jar
  16. linux 驱动笔记(一)
  17. html自动验证邮件地址格式,JavaScript表单验证和邮箱格式验证的方法
  18. 【太虚AR_v0.1】使用教程 | 视频播放
  19. MyBatis - 批量插入
  20. Spring Security + JWT实现权限管理

热门文章

  1. 【IDEA 2016】intellij idea tomcat jsp 热部署
  2. core--线程同步(内核模式)
  3. Kevin专栏---如何制作试用版安装包
  4. 米尔电子Zynq UltraScale MPSoC核心板资料介绍
  5. 如何写年终总结(转)
  6. 【最新版】Java速成路线(急于找工作!)
  7. 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
  8. 用JSONObject解析和处理json数据
  9. 网络爬虫--25.【selenium实战】实现拉勾网爬虫之--selenium获取数据
  10. MySQL 常用内置函数