效果图

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

验证不通过是会进行转发到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++中对C的扩展学习新增语法——namespace

    NAMESPACE语法 namespace主要解决了命名冲突的问题,语法如下 Namespace注意事项: namespace中可以定义常量.变量.函数.结构体.枚举.类等. namespace 只能 ...

  2. nyoj 467 中缀式变后缀式 (栈)

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀 ...

  3. pat 1046 Shortest Distance(20 分) (线段树)

    1046 Shortest Distance(20 分) The task is really simple: given N exits on a highway which forms a sim ...

  4. nyoj 100-1的个数 (因为只统计1的个数,连栈都不需要了)

    100-1的个数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:33 提交数:42 难度:1 题目描述: 小南刚学了二进制,他想知道一个数的二进制表示中有多少个1,你能帮他写一个程 ...

  5. Spring Bean的生命周期、后置处理器、定义继承

    目录: 了解Spring的基本概念 Spring简单的示例 Spring Bean的定义及作用域 1.Bean的生命周期 Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Be ...

  6. VMware虚拟机Linux中增加磁盘空间的扩容操作

    VMwareware虚拟机安装的Red Hat Enterprise Linux系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置.结合自己的实践,总结 ...

  7. 领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重 ...

  8. epoll介绍及使用

    小程序功能:简单的父子进程之间的通讯,子进程负责每隔1s不断发送"message"给父进程,不需要跑多个应用实例,不需要用户输入. 首先上代码 #include<assert ...

  9. 如何进行Flink项目构建,快速开发Flink应用程序?

    项目模板 Flink应用项目可以使用Maven或SBT来构建项目,Flink针对这些构建工具提供了相应项目模板. Maven模板命令如下,我们只需要根据提示输入应用项目的groupId.artifac ...

  10. 给公司写的composer包开发的规范

    版本格式 主版本号.次版本号.修订号 版本号递增规则 主版本号:当你做了不兼容的 API 修改 次版本号:当你做了向下兼容的功能性新增 修订号:当你做了向下兼容的问题修正 先行版本号及版本编译元数据可 ...