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 分别下载 ...
随机推荐
- windows系统cmd命令行窗口查看端口占用情况
# 查看所有在用端口 netstat -ano # 查看指定端口 netstat -ano | findstr 8899 # 结束该进程:taskkill /f /t /im javaw.exe:或者 ...
- 在oracle数据库中创建DBLink
涉及到两个数据库之间的访问时,可以创建datebase link来互相访问. ’创建方法: 1.通过PL/SQL客户端,找到datebase link,右键新建 输入相应信息 2.直接用命令行创建 一 ...
- hdu 1385 Minimum Transport Cost (Floyd)
Minimum Transport CostTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式
单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...
- 搭建wordPress遇到无法连接数据库的问题
在确认了数据库用户,密码,地址都没有错的情况下,仍然出现无法连接数据库的问题,以至无法安装wordpress 我的wordpress:4.8.1-zh_CN 解决办法: 1.更改php的版本(我的改为 ...
- Java虚拟机详解(十)------类加载过程
在上一篇文章中,我们详细的介绍了Java类文件结构,那么这些Class文件是如何被加载到内存,由虚拟机来直接使用的呢?这就是本篇博客将要介绍的——类加载过程. 1.类的生命周期 类从被加载到虚拟机内存 ...
- 微博验证码的识别并登录获取cookies
记得以前微博是用的宫格验证码,现在不一样了,用的是滑块验证码和 点触验证码,每天登陆的第一次基本用的是滑块,继续登录就都用的是点触验证码.所以滑块验证码不写,感兴趣的可以补上. 代码: 这里用的超级鹰 ...
- 2019-10-8:渗透测试,基础学习,php基础,会话,文件包含,笔记
php面向对象基础->调用符号构造函数construct,主要用来创建对象时初始化对象,为成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 析构函数destructor,与构造函数相 ...
- linux ftp配置及实操
一.基础知识: 1.ftp:file transfer protocal 及文件传输协,工作与应用层. 2.ftp协议的实现: 服务器端实现软件:vsftpd,pureftpd,filezilla s ...
- Flask入门学习——蓝图Blueprint
flask蓝图可以实现应用程序的模块化,即通常作用于相同的url前缀,eg:/user/id,/user/profile等类似这样,可以放在一个模块当中,这样会让应用更加清晰便于开发与维护. 这里有个 ...