asp.netcore mvc 权限拦截
1-背景介绍
需要做一个简单权限系统,基于 角色,用户,菜单 的模式
基于IActionFilter全局拦截,在内部跳转或者浏览器跳转的时候,拦截是成功的,当通过AJAX 请求的时候,页面就不会跳转
2-登录后初始化该用户权限到redis 缓存
因为菜单没有设置失效机制,所以登录就刷新菜单缓存数据
3- 基于 IActionFilter 全局过滤
在OnActionExecuting 方法 用判断 改动作是否有权限,没有的话就跳转一个 拒绝访问的友好页面。
首先,我们需要判断是否是AJAX 请求,如果是的话,返回你的 正常的处理AJAX请求的返回JSON串 就可以了,前端就可以直接拿到然后做出正确的动作
如果不是则直接跳转无权限 访问 的页面
4- 代码及效果展示
public void OnActionExecuting(ActionExecutingContext context)
{
var hasPermission = true;
//权限拦截
if (context.HttpContext.User.Identity.IsAuthenticated)
{
var identity = context.HttpContext.User as ClaimsPrincipal;
var accountId = identity.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value;
var accountName = identity.Claims.First(x => x.Type == ClaimTypes.Name).Value;
if (accountName != "admin")
{
var menuDatalist = _menuMudoleStore.GetSysmodules(Convert.ToInt32(accountId), accountName, openRedis: true);
var currentUrl = context.HttpContext.Request.Path.ToString().ToLower();
if (currentUrl != "/Account/AccessDenied".ToLower())
{
if (menuDatalist == null && menuDatalist.Count <= )
{
hasPermission = false;
}
else
{
var mtypeid = (int)SysModuleType.module;
var pageList = menuDatalist.Where(x => x.moduletypeid != mtypeid).ToList();
if (!pageList.Any(x => x.url.ToLower() == currentUrl))
{
hasPermission = false;
}
}
}
}
}
if (!hasPermission)
{
if (context.HttpContext.Request.IsAjax())
{
context.Result = new JsonResult(new ReturnResult<string>
{
success = false,
status = ,
message = "您无权限访问",
data= "/Account/AccessDenied"
});
}
else
context.HttpContext.Response.Redirect("/Account/AccessDenied");
}
}
后台代码 GlobalActionFilter
//初始化树
function initTree(roleid) {
$.ajax({
url: '/Role/GetMenuTree',
type: 'get',
data: {
roleid: roleid
},
success: function (result) {
console.log(result)
if (result.success) {
zTreeObj = $.fn.zTree.init($("#permissiontree"), setting, result.data);
//
toastr.info('数据加载成功', '提示');
} else {
toastr.error(result.message, '警告');
//权限拦截
if (result.status == ) {
$('#authperssionsformmodal').modal('hide');
//setTimeout(function () {
// window.location.href = result.data;
//}, 500);
}
}
$('#dvloading').modal('hide');
},
beforeSend: function () {
// Handle the beforeSend event
$("#dvloading").modal({ backdrop: 'static', keyboard: false });
},
complete: function (xhr) {
// Handle the complete event
$('#dvloading').modal('hide'); },
error: function (e) {
$('#dvloading').modal('hide');
toastr.error('系统错误,请重试', '警告');
window.clearInterval(timer);
}
});
}
前端代码


asp.netcore mvc 权限拦截的更多相关文章
- ASP.NETCORE MVC模块化
ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...
- asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解
一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...
- ASP.NET MVC案例——————拦截器
摘要 本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善“MVC公告发布系统”, ...
- 开篇ASP.NET MVC 权限管理系列
开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
- Asp.NetCore MVC Web 应用
Asp.NetCore MVC 与 普通的MVC 基本一致, 只是代码结构稍有改动 一.创建项目 1. 2. 3. 项目结构 二. 构建数据模型 1. Startup类中配置EF Core MySql ...
- 实现对ASP.NETMvc及Asp.NetCore的权限控制
AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...
- Asp.net MVC 权限过滤器实现方法的最佳实践
在项目开发中,为了安全.方便地判断用户是否有访问当前资源(Action)的权限,我们一般通过全局过滤器来实现. Asp.net MVC 页面中常见的权限判断使用过滤器主要在以下几种情况(根据权限判断的 ...
- ASP.NET MVC权限验证 封装类
写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...
- ASP.NET MVC权限控制思路
在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求.页面按钮.字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我 ...
随机推荐
- 用CSS/CSS3 实现水平居中和垂直居中,水平垂直居中的方式
一.水平居中 (1)行内元素解决方案:父为块元素+text-align: center 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可: 使用te ...
- jps命令无法找到
[root@namenode ~]# jpsbash: jps: command not found...[root@namenode ~]# find / -name jpsfind: ‘/run/ ...
- Microbit蓝芽配对
Microbit蓝芽配对 (Bluetooth Pairing) Microbit 可以像手机或平板与其他蓝芽装置一样,一旦做完第一次配对完就可以使用”蓝芽服务” paired with the mi ...
- 11-while循环基本使用
hm_02_第一个while循环.py def main(): i = 1 while i <= 3: print(i, 'Hello world') i += 1 print(i) 1 Hel ...
- 多线程深入理解和守护线程、子线程、锁、queue、evenet等介绍
1.多线程类的继承 import threading import time class MyThreading(threading.Thread): def __init__(self,n): su ...
- 网络中可以引用的jquery库
网络项目可以直接引用这个jquery库 <script src="http://www.codefans.net/ajaxjs/jquery-1.4.2.min.js"> ...
- 20155236 2016-2017-2 《Java程序设计》第三周学习总结
20155236 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 1.在原始码中只能有一个公开类,且主文档名必须与公开类名称相同:其实只要有一个类定义,就会产 ...
- 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
学号20155308 2016-2017-2 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验要求 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译 ...
- 关于Linux_shell中的管道命令pipe “|”的简单学习和使用
什么是 "|"? |其实是linux shell 中的一个命令:管道命令(pipe) 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也 ...
- 20155322 《Java程序设计》课堂实践项目MyOD
20155322 <Java程序设计>课堂实践项目MyOD 实践要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码和 ...