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. eclipse 配置

    访问地址        https://www.eclipse.org/ . . . 配置工作目录:存放1.项目代码    2.IDE相关配置信息 //修改编码时的字体 //修改编码格式 没有配置to ...

  2. 小程序中 function (res)的理解

    刚看到小程序里面一段代码 success: function (res) { console.log('搜索结果:'); console.log(res); wx.hideToast(); if (r ...

  3. 完美解决 Cydia 不能上网

    国行手机比美版.港版.韩版手机新增了网络授权的功能,iOS 10 及以上系统版本,任何应用首次打开,如果有请求网络的行为,都会提示网络请求授权的对话框. 首次打开 Cydia 并没有提示网络请求授权的 ...

  4. PHP导入Excel表

    初始化参数,先导入PHPExcel类 /** * 读出Excel表格数据 * @param $filename 文件名 * @param string $encode 编码格式 * @return a ...

  5. Oracle之子程序(存储过程、方法、包)

    .过程[存储过程] CREATE [OR REPLACE] PROCEDURE <procedure name> [(<parameter list>)] IS|AS < ...

  6. Python2+python3——多版本启动和多版本pip install问题

    背景描述: python2版本都知道维护到2020年,目前使用python的很大一部分用户群体都开始改安装并且使用最新版的python3版本了,python2和python3在编程大的层面不曾改变,有 ...

  7. c语言宏

    使用 c语言的宏是在预处理时候对字符进行简单替换. 优点:1.如果要改一个变量,只需要改宏就可以了,也就是只改一次;2.宏函数展开和普通函数一样,但是它没有普通函数调用的过程,不需要压栈出栈等操作,所 ...

  8. D3.js和three.js

    D3.js是一个数据可视化的库,看看他们的DEMO就可以知道,技术基础是SVG.兼容性是IE9+. three.js是以webgl为基础的库,封装了一些3D渲染需求中重要的工具方法与渲染循环.

  9. Linux入门第五天——shell脚本入门(上)基本概念

    一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...

  10. HDFS(0.20.2)运营中急救方案

    这段时间折腾的都是hadoop和lucene,总结了hadoop在运营过程中出现问题时的解决方案,请大家指教! HDFS(0.20.2)运营中急救方案 1           Namenode 挂掉( ...