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 权限拦截的更多相关文章

  1. ASP.NETCORE MVC模块化

    ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...

  2. asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解

    一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...

  3. ASP.NET MVC案例——————拦截器

    摘要      本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题      我们继续完善“MVC公告发布系统”, ...

  4. 开篇ASP.NET MVC 权限管理系列

    开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇   用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...

  5. Asp.NetCore MVC Web 应用

    Asp.NetCore MVC 与 普通的MVC 基本一致, 只是代码结构稍有改动 一.创建项目 1. 2. 3. 项目结构 二. 构建数据模型 1. Startup类中配置EF Core MySql ...

  6. 实现对ASP.NETMvc及Asp.NetCore的权限控制

    AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...

  7. Asp.net MVC 权限过滤器实现方法的最佳实践

    在项目开发中,为了安全.方便地判断用户是否有访问当前资源(Action)的权限,我们一般通过全局过滤器来实现. Asp.net MVC 页面中常见的权限判断使用过滤器主要在以下几种情况(根据权限判断的 ...

  8. ASP.NET MVC权限验证 封装类

    写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...

  9. ASP.NET MVC权限控制思路

    在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求.页面按钮.字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我 ...

随机推荐

  1. Windows.Devices API in a C# WinForm Win32 Desktop application in Windows 10

    https://social.msdn.microsoft.com/Forums/windows/en-US/40b4f86d-b6d5-430e-a235-7fc003dec4c4/how-to-u ...

  2. Python基础学习笔记(一)安装以及IDE的配置

    一.初识Python Python官方网站:www.python.org 版本:python-3.4.3.amd64 初次接触Python,没有使用Python 2.x进行开发真实项目的经历.所以不知 ...

  3. Python学习之——Python安装

    环境:Centos6.5+python2.7.5 1.centons6.5系统中是已经安装了python的,先查看版本是不是需要的 python --version 2.安装一些必要的包,防止后面需要 ...

  4. java入门---变量类型&类变量&局部变量&实例变量&静态变量

        在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下:     type identifier [ = value][, identifier [= value] ...] ; ...

  5. JournalNode的作用

    NameNode之间共享数据(NFS .Quorum Journal Node(用得多)) 两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信.当activ ...

  6. 2017-2018-1 20155307 《信息安全系统设计基础》第十周课上未完成补充以及课下IPC作业

    课上内容2:stat命令的实现-mysate 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云 ...

  7. 20145234黄斐《java程序设计基础》第一周

    教材学习内容总结 1.java是SUN公司推出的面相网络的编程语言,当时取名Oak,后改名Java. 2.Java三大平台分别为:Java SE.Java EE与Java ME. 3.Java不仅是程 ...

  8. [hdu6051]If the starlight never fade-[欧拉函数+原根]

    Description 传送门 Solution orz大佬yxq..本题神仙 设g为P的原根. 设$x=g^{a}$,$y=g^{b}$. 由于$(g^{a}+g^{b})^{i}\equiv (g ...

  9. (ex)Lucas总结

    (ex)Lucas总结 普通Lucas 求 \[ C_n^m\;mod\;p \] 其中\(n,m,p\leq 10^5\)其中\(p\)为质数 公式不难背,那就直接背吧... \[ C_n^m\;m ...

  10. 【linux】vim常用快捷键(转)

    原文链接:https://www.cnblogs.com/tianyajuanke/archive/2012/04/25/2470002.html 1.vim ~/.vimrc 进入配置文件 如果不知 ...