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 分别下载 ...
随机推荐
- 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流
本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...
- 64位手机部署centos
在64位处理器的手机上部署centos会有下面的困难. 1. 没有现成的aarch64的rootfs. 2. termux没有rpm2cpio进行部署. 3. armv8*不会被centos识别为aa ...
- 菜鸟手把手学Shiro之shiro授权流程
一.首先我们从整体去看一下授权流程,然后再根据源码去分析授权流程.如下图: 流程如下: 1.首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityMan ...
- JS三座大山再学习(二、作用域和闭包)
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' c ...
- window系统下删除多余的引导
window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...
- GDG Xi'an DevFest 2019 闪电演讲 -《假如我是一个浏览器》PPT(经典多图,建议收藏)
GDG Xi'an DevFest2019演讲PPT链接: http://tmp.link/f/5dd9e6bf461b6 闪电演讲<假如我是一个浏览器>PPT链接: https://gi ...
- Spring中常见的设计模式——原型模式
1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...
- Ansible Playbooks 介绍 和 使用 二
目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...
- Docker部署Mysql集群
单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...
- Django如何启动源码分析
Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...