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. 用CSS/CSS3 实现水平居中和垂直居中,水平垂直居中的方式

    一.水平居中 (1)行内元素解决方案:父为块元素+text-align: center 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可: 使用te ...

  2. jps命令无法找到

    [root@namenode ~]# jpsbash: jps: command not found...[root@namenode ~]# find / -name jpsfind: ‘/run/ ...

  3. Microbit蓝芽配对

    Microbit蓝芽配对 (Bluetooth Pairing) Microbit 可以像手机或平板与其他蓝芽装置一样,一旦做完第一次配对完就可以使用”蓝芽服务” paired with the mi ...

  4. 11-while循环基本使用

    hm_02_第一个while循环.py def main(): i = 1 while i <= 3: print(i, 'Hello world') i += 1 print(i) 1 Hel ...

  5. 多线程深入理解和守护线程、子线程、锁、queue、evenet等介绍

    1.多线程类的继承 import threading import time class MyThreading(threading.Thread): def __init__(self,n): su ...

  6. 网络中可以引用的jquery库

    网络项目可以直接引用这个jquery库 <script src="http://www.codefans.net/ajaxjs/jquery-1.4.2.min.js"> ...

  7. 20155236 2016-2017-2 《Java程序设计》第三周学习总结

    20155236 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 1.在原始码中只能有一个公开类,且主文档名必须与公开类名称相同:其实只要有一个类定义,就会产 ...

  8. 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    学号20155308 2016-2017-2 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验要求 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译 ...

  9. 关于Linux_shell中的管道命令pipe “|”的简单学习和使用

    什么是 "|"? |其实是linux shell 中的一个命令:管道命令(pipe) 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也 ...

  10. 20155322 《Java程序设计》课堂实践项目MyOD

    20155322 <Java程序设计>课堂实践项目MyOD 实践要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码和 ...