效果图

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

验证不通过是会进行转发到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=,
/// <summary>
/// 不允许访问
/// </summary>
NoAllow=,
/// <summary>
/// 可以访问
/// </summary>
OK=
}

全局变量

  /// <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=,
AllowRequest="Home/Login"
},
new RightsManagement(){
ID=,
AllowRequest="Home/ClearLogin"
},
new RightsManagement(){
ID=,
AllowRequest="Home/Error"
}
,
new RightsManagement(){
ID=,
AllowRequest="Home/AjaxView"
}
}; private ErrorEnum errorEnum;
登陆与注销函数
   /// <summary>
/// 登陆函数
/// </summary>
public void LoginMember() {
member = new Member()
{
Name = "张三",
RightsList = new List<RightsManagement>() {
new RightsManagement(){
ID=,
AllowRequest="Home/GetData"//接口
},
new RightsManagement(){
ID=,
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()>)
{
//允许默认允许的请求通过
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() == )
{
//没有请求的权利
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

asp.net core 拦击器制作的权限管理系统DEMO的更多相关文章

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

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

  2. Asp.net Core, 基于 claims 实现权限验证 - 引导篇

    什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...

  3. [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(六.结语)

    到这里就结束了,真的结束了,源码会在文末分享! 另外录了两个视频,对这个系统进行了演示! 做有意义的事情,原此生无悔! 视频地址:使用asp.net core 快速构建权限管理模块1 使用asp.ne ...

  4. thinkphp整合系列之rbac的升级版auth权限管理系统demo

    权限管理基本是作为网站的标配了: 除非是像博客这类个人使用的:否则权限管理的重要性不言而喻: 今个就来写写auth权限管理: thinkphp已经内置了auth权限类位于:/ThinkPHP/Libr ...

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

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

  6. asp.net core 3.x 授权默认流程

    一.前言 接上一篇<asp.net core 3.x 授权中的概念>,本篇看看asp.net core默认授权的流程.从两个方面来看整个授权系统是怎么运行的:启动阶段的配置.请求阶段中间件 ...

  7. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  8. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  9. IIS 上部署 ASP.NET Core 应用程序

    1.下载 .Net Core Runtime 和 Hosting Bundle 下载地址:https://dotnet.microsoft.com/download/dotnet-core 分别下载 ...

随机推荐

  1. 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...

  2. 64位手机部署centos

    在64位处理器的手机上部署centos会有下面的困难. 1. 没有现成的aarch64的rootfs. 2. termux没有rpm2cpio进行部署. 3. armv8*不会被centos识别为aa ...

  3. 菜鸟手把手学Shiro之shiro授权流程

    一.首先我们从整体去看一下授权流程,然后再根据源码去分析授权流程.如下图: 流程如下: 1.首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityMan ...

  4. JS三座大山再学习(二、作用域和闭包)

    原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' c ...

  5. window系统下删除多余的引导

    window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...

  6. GDG Xi'an DevFest 2019 闪电演讲 -《假如我是一个浏览器》PPT(经典多图,建议收藏)

    GDG Xi'an DevFest2019演讲PPT链接: http://tmp.link/f/5dd9e6bf461b6 闪电演讲<假如我是一个浏览器>PPT链接: https://gi ...

  7. Spring中常见的设计模式——原型模式

    1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...

  8. Ansible Playbooks 介绍 和 使用 二

    目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...

  9. Docker部署Mysql集群

    单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...

  10. Django如何启动源码分析

    Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...