.Net MVC实现角色-API权限验证的一种方式

阅文时长

| 1.15分钟
字数统计

| 1844.8字符
主要内容

| 1、引言&背景 2、部分设计分享 3、声明与参考资料
『.Net MVC实现角色-API权限验证的一种方式』 编写人

| SCscHero
编写时间

| 2022/3/27 PM9:31
文章类型

| 系列
完成度

| 已完成
座右铭

每一个伟大的事业,都有一个微不足道的开始。

一、引言&背景 完成度:100%

a) 应对问题&背景

RBAC的权限设计已经应用到越来越多的系统中,然而在一些老项目中,对各个Role可访问的API并未做相关的限制,从而引发高级别的安全漏洞。这里介绍一种简单且比较可靠的设计。

b) 应用场景

  • 在RBAC的权限设计中,对应的Role进行API权限检验。

c) 分析思路

  1. 首先对”Role-API”的对应关系进行梳理,一般用一张关系表进行存储。存储在缓存中。(缓存写入节点、过期时间按需而论),比如:博主是在项目启动的Global.asax文件中写入缓存,设置为永不过期,理由是项目功能已基本不迭代(当然这也有很多不便之处:例如如果按博主的这种方式,如果寄托于IIS,需要Stop后Start来更新缓存)。
  2. 新增一个特性AjaxAuthorizeAttribute继承于身份验证AuthorizeAttribute特性,重写OnAuthorization方法;写入逻辑为:用服务器端存储的当前用户的上下文信息中的Role取其可访问的API集合,再与访问接口的URL做判断,判断此Role是否具备该接口的权限,若不具备权限则返回403.cshtml的静态页;此特性用来标记需验证的控制器或Action。
  3. 以上这一种方式即可简单且相对可靠的实现对RBAC权限设计中,Role-API的权限校验。

二、部分设计分享 完成度:100%

a) Role-API存储关系表

以下是存储”Role-API”对应关系的关系表,如图博主是用了五个字段来存:步长为10主键ID、RoleID、RoleName、Url、APiDesc。其中RoleName和ApiDesc是冗余字段,方便开发者阅读设计的,在缓存中存的对象不需要存RoleName和ApiDesc。

其中有一点需要注意的是URL,一般都是维护成/Area/Controller/Action。

b) AjaxAuthorizeAttribute

AjaxAuthorizeAttribute是自定义的重写身份验证特性的类。以下为一个通用设计。其中需要注意的是第2步骤,在取AuthorizationContext中的请求路由时,有几种取数方式,注意区别。在以下代码示例中有一些解释可以参考。

    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //1. 从缓存中取数据的Obj对象,并将Obj转换为实体对象。(转换方式是否最优有待思考优化,先不做讨论)
            IList objList = (IList)CacheDataLogic.CacheHelper.GetData(ParameterNames.CacheRoleResourceAll);
            var res = objList.Cast();
            //ApplicationContext是我们封装的取用户上下文的类
            var RoleName = ((RoleModel)CacheDataLogic.CacheHelper.GetData(ParameterNames.CacheClientUserRole + ApplicationContext.Current.LoginUserInfo.UserModel.UserID)).RoleName;
            //2. 取当前用户API集合是否包含请求集合。
            //filterContext.HttpContext.Request.RawUrl//路由后带参数,取到的数据是带参数的。比如:/SCscCon/SCscAction?scsc=6666。
            //filterContext.HttpContext.Request.Path//可以过滤掉?后的参数,比如:/Claim/SCscAction /?scsc=4430。但无法解决不带?的参数URL。比如:    /Claim/ClaimApply/4430
            var spA = filterContext.HttpContext.Request.Path.Split('/');//如果上一种不是想用来判断的参数,可以做截取。比如下面这样。
            //3. 判断当前用户API集合是否包含请求集合。
            if (res.Where(o => o.RoleName == RoleName && o.Url == ("/" + spA[1] + "/" + spA[2])).Count() > 0)
            {
                base.OnAuthorization(filterContext);
            }
            else
            {
                HttpContext.Current.Response.Redirect("~/AuthorizeError.html");
                return;
            }
        }
    }

另外建议大家可以了解一下AuthorizeAttribute对象,其中的各方法的调用顺序可以研究研究,比如HandleUnauthorizedRequest方法等等,都是需要掌握的知识点。

c) 非授权通用页

用来重定向的通用页html代码,记录一下,后面方便复用。


        Error.

        An error occurred while processing your request.

三、声明与参考资料 完成度:100%

原创博文,未经许可请勿转载。

如有帮助,欢迎点赞、收藏、关注。如有问题,请评论留言!如需与博主联系的,直接博客私信SCscHero即可。

Original: https://www.cnblogs.com/SCscHero/p/16098189.html
Author: SCscHero
Title: .Net MVC实现角色-API权限验证的一种方式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608915/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Ubuntu无法telnet

    (1)/etc/hosts被修改过 (2)防火墙没有关闭 (3)没有安装相关服务 (4)/etc/inetd.conf文件没有telnet相关内容 (1)把/etc/hosts文件…

    Linux 2023年6月8日
    098
  • 【电子取证:FTK Imager篇】DD、E01系统镜像仿真

    星河滚烫,人生有理想!​—【suy999】 一、DD、E01系统镜像动态仿真 在电子取证分析过程中,我们经常遇到DD、E01等系统镜像,然而,并非所有工作者手边都有自动…

    Linux 2023年6月13日
    0108
  • 【计算题】考研数据结构计算题型整理

    题型1:递归程序,一般使用公式进行递推 int fact(int n){ if(n 本题是求阶乘的递归代码,即n * (n-1) * …. * 1。每次递归调用 fac…

    Linux 2023年6月13日
    0108
  • LinuxKernel(一)

    首先,回顾一下基础的宏操作: C语言宏 # 与 ## #的作用是字符串化:在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define ERROR_LOG…

    Linux 2023年6月8日
    0112
  • django学习__1

    Django python网络编程回顾 之前我们介绍过web应用程序和http协议,简单了解过web开发的概念。Web应用程序的本质 接收并解析HTTP请求,获取具体的请求信息 处…

    Linux 2023年6月7日
    0102
  • haproxy

    1. haproxy简介 2. haproxy配置文件解析 3. haproxy搭建httpd负载均衡 4. 启动haproxy自带的监控界面 haproxy简介 HAProxy是…

    Linux 2023年6月13日
    0134
  • 你真的了解JAVA中对象和类、this、super和static关键字吗

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 Java对象究竟是什么? 创建…

    Linux 2023年6月6日
    0111
  • QT获取linux下的当前用户名

    故事背景:客户端启动的时候需要加载机器/home/xx/test.jpg的图片作为背景图,但是有的机器用户名叫AAA,有的机器名叫BBB,所以我需要获取当前用户的home目录 技术…

    Linux 2023年6月13日
    0103
  • .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)

    我们来创建动态菜单吧 首先,先对动态菜单的概念、操作、流程进行约束:1.Host和各个Tenant有自己的自定义菜单2.Host和各个Tenant的权限与自定义菜单相关联2.Ten…

    Linux 2023年6月7日
    095
  • Python 批处理sql插入 %s 占位符报错

    语法错误 在查询表达式 ‘%s’ 中。 (-3100) (SQLPrepare)”) 语法错误 在查询表达式 ‘%s’ …

    Linux 2023年6月7日
    0114
  • WEB自动化-09-Cypress 测试报告

    9 测试报告 一份好的测试报告,可以很直观的看出整个测试过程的各种数据。而Cypress的测试报告是 基于Mocha,因此任何支持Mocha的测试报告都可以应用于Cypress。但…

    Linux 2023年6月7日
    0118
  • Docker学习笔记

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 Docker概述 Docker学习链接 官网链接:Home – Docker Docker与虚拟机比较 虚拟化技术 …

    Linux 2023年5月27日
    098
  • QLabel文字内容行间距

    故事背景:最近做项目升级,需要界面上展示升级更新内容,用QLabel展示,字符串是这样的”1、XXXXXXX;2、XXXXXXX;3、XXXXXXX”,一个…

    Linux 2023年6月13日
    096
  • Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 ​LNMP是Linux + Nginx + MySQL + PHP 四个系统的首字母缩写,相对于 LAMP(Linux + Ap…

    Linux 2023年5月27日
    0113
  • 在线安装Docker

    安装 yum-utils 包yum install -y yum-utils 设置存储库# 官方地址(比较慢) yum-config-manager \ –add-repo \ …

    Linux 2023年6月7日
    083
  • 【.Net vs Java? 】 看一看二者的类有多像?

    1. 包(Package)、命名空间(NameSpace) 在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说: 为了使类型更易于…

    Linux 2023年6月7日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球