asp.net core 拦击器制作的权限管理系统DEMO
效果图
没有登陆不会执行请求日期的方法,不管是否登陆都不允许访问请求时间方法
验证不通过是会进行转发到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的更多相关文章
- asp.net core 使用 AccessControlHelper 控制访问权限
asp.net core 使用 AccessControlHelper 控制访问权限 Intro 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权 ...
- Asp.net Core, 基于 claims 实现权限验证 - 引导篇
什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...
- [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(六.结语)
到这里就结束了,真的结束了,源码会在文末分享! 另外录了两个视频,对这个系统进行了演示! 做有意义的事情,原此生无悔! 视频地址:使用asp.net core 快速构建权限管理模块1 使用asp.ne ...
- thinkphp整合系列之rbac的升级版auth权限管理系统demo
权限管理基本是作为网站的标配了: 除非是像博客这类个人使用的:否则权限管理的重要性不言而喻: 今个就来写写auth权限管理: thinkphp已经内置了auth权限类位于:/ThinkPHP/Libr ...
- asp.net core mvc权限控制:在视图中控制操作权限
在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...
- asp.net core 3.x 授权默认流程
一.前言 接上一篇<asp.net core 3.x 授权中的概念>,本篇看看asp.net core默认授权的流程.从两个方面来看整个授权系统是怎么运行的:启动阶段的配置.请求阶段中间件 ...
- ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...
- ASP.NET Core 3.0 使用gRPC
一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...
- IIS 上部署 ASP.NET Core 应用程序
1.下载 .Net Core Runtime 和 Hosting Bundle 下载地址:https://dotnet.microsoft.com/download/dotnet-core 分别下载 ...
随机推荐
- T-SQL Part X: UNION, EXCEPT and INTERSECT
MSDN上关于EXCEPT和INTERSECT的文档.MSDN上关于UNION的文档. 值得注意的是,UNION其实有两种,一种是普通的UNION,另外一种是UNION ALL.加上EXCEPT和IN ...
- 创建OData Service(基于ASP.NET 4.6.1, EF 6),Part I:Project initialize
由于ASP.NET Core 1处于RC阶段,加上OData WebAPI 对ASP.NET Core 1的跟进不是很积极,基于ASP.NET Core 1的Alpha 1版本已经N月没有check ...
- etcd-operator快速入门完全教程
Operator是指一类基于Kubernetes自定义资源对象(CRD)和控制器(Controller)的云原生拓展服务,其中CRD定义了每个operator所创建和管理的自定义资源对象,Contro ...
- Master原理
1.主备切换机制原理剖析与源码分析 2.注册机制原理剖析与源码分析 3.状态改变处理机制源码分析 4.资源调度机制源码分析(schedule(),两种资源调度算法)(核心) 一.主备切换机制原理 1. ...
- suseoj 1209: 独立任务最优调度问题(动态规划)
1209: 独立任务最优调度问题 时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 用2台处理机A和B处理 ...
- [ch02-00] 反向传播与梯度下降的通俗解释
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 第2章 神经网络中的三个基本概念 2.0 通俗地理解三大 ...
- Opencv的线性滤波和非线性滤波
线性滤波 :方框滤波 均值滤波 高斯滤波 非线性滤波: 中值滤波 双边滤波 这几个滤波都是起模糊作用 去除噪点 不废话了 下面是代码 #include <opencv2/opencv.h ...
- MyEclipse使用总结
0.快捷键 ================================================================================ 编辑: Ctrl+Shif ...
- 超速入门AT指令集 | 我的物联网成长记
[摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...
- UINavigationController-自定义导航栏标题按钮.
见视频0416 自定义导航栏标题按钮,在Bar Button Item中加入UIButton,设置UIButton的图片和标题,还可以自定义自定义UIButton实现特效按钮.