c# .net core项目角色授权机制

前言

角色授权机制是确保应用程序安全性的重要组成部分,它允许开发者根据用户的角色来限制对应用程序中不同资源的访问。

基本概念:

角色授权基于用户角色的访问控制,即根据用户所属的角色来决定其能够访问的资源或执行的操作。在.NET Core中,这通常与身份认证(Authentication)一起使用,以确保只有经过验证的用户才能被授权访问特定资源。

案例

在上一篇blog 中,我们完成了对.net Core项目添加了JWT签名的生成与校验,这里,我们基于上一篇blog中演示的代码中进行改进,在jwt中添加Role信息。

c# .net core项目中使用JWT进行权限校验icon-default.png?t=N7T8http://t.csdnimg.cn/XjqqX

 角色枚举

首先,我们新建一个枚举AuthorizeRoleName,用于表示不同的角色 。

public enum AuthorizeRoleName
{Administrator,  Editor,  Viewer  
}

 用户信息增加角色

然后在UserRes中添加一个新的属性RoleName,用于填写用户角色。

public class UserRes
{/// <summary>/// 用户名/// </summary>[Required]public string Name { get; set; }/// <summary>/// 密码/// </summary>[Required]public string Password { get; set; }/// <summary>/// 用户角色/// </summary>[Required]public AuthorizeRoleName RoleName { get; set; }
}

再在生成token的时候往claims中加入 

new Claim("RoleName",user.RoleName.ToString()),

这样,我们调用GetToken接口时就可以设置角色,并存储到token中。

 

我们来进行测试一下,将接口获取到的token放到在线解析工具JSON Web Tokens - jwt.io中解析一下,可以看到已经有RoleeName的信息了。

增加AdminAuthorizeAttribute类

  • 用途:这是一个自定义的属性(Attribute),继承自TypeFilterAttribute。它允许开发者通过在其上指定AuthorizeRoleName枚举值,来标记哪些类或方法需要特定的角色授权。
  • 构造函数:接收一个AuthorizeRoleName枚举类型的参数role,该参数用于指定允许访问的角色。在构造函数中,它调用了基类TypeFilterAttribute的构造函数,并传入了AdminAuthorizeFilter类型的实例,同时将role作为参数传递给AdminAuthorizeFilter
  • 特性:通过AttributeUsage特性指定了这个自定义属性可以应用于类(Class)或方法(Method),并且允许多次应用(AllowMultiple = true),还可以被子类继承(Inherited = true)。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AdminAuthorizeAttribute : TypeFilterAttribute
{public AuthorizeRoleName Role { get; }public AdminAuthorizeAttribute(AuthorizeRoleName role) : base(typeof(AdminAuthorizeFilter)){Role = role;Arguments = new object[] { role };}
}

:base(typeof(AdminAuthorizeFilter)): 这是构造函数的初始化器(Constructor Initializer),它调用了基类TypeFilterAttribute的构造函数,并传递了一个参数typeof(AdminAuthorizeFilter)。typeof(AdminAuthorizeFilter)是一个Type对象,它表示AdminAuthorizeFilter类的类型信息。这里,它告诉TypeFilterAttribute,当这个自定义属性被应用时,应该使用AdminAuthorizeFilter类作为过滤器。

增加AdminAuthorizeFilter类 

  • 接口实现:实现了IAuthorizationFilter接口,这意味着它将在MVC或Razor Pages的授权流程中被调用。
  • 构造函数:接收一个AuthorizeRoleName枚举类型的参数role,这个参数是通过AdminAuthorizeAttribute传递过来的,用于指定允许访问的角色。
  • OnAuthorization方法:这是授权逻辑的核心。首先,它检查用户是否已认证(即是否已经登录)。如果用户未认证,则返回一个ChallengeResult,这通常会导致用户被重定向到登录页面。如果用户已认证,则通过调用GetCurrentUserRole方法获取用户的角色,并与允许的角色进行比较。如果用户角色不匹配,则返回一个ForbidResult,这通常表示用户没有权限访问该资源,并返回403 Forbidden状态码。
  • GetCurrentUserRole方法:这是一个辅助方法,用于从HttpContext中提取用户的角色信息。它查找用户声明(Claims)中类型为"RoleName"的声明,并将其值尝试转换为AuthorizeRoleName枚举类型。如果转换成功,则返回该枚举值;如果失败或找不到角色声明,则抛出异常。
public class AdminAuthorizeFilter : IAuthorizationFilter
{private readonly AuthorizeRoleName _role;public AdminAuthorizeFilter(AuthorizeRoleName role){_role = role;}public void OnAuthorization(AuthorizationFilterContext context){// 检查用户是否已认证  if (!context.HttpContext.User.Identity.IsAuthenticated){context.Result = new ChallengeResult();return;}// 检查用户是否属于指定的角色通,常涉及到检查用户的Claims或其他安全令牌中的信息  // 我们有一个方法GetCurrentUserRole()来获取当前用户的角色  var userRole = GetCurrentUserRole(context.HttpContext); if (userRole != _role){context.Result = new ForbidResult(); // 或者返回403 Forbidden,取决于你的需求  }}// private AuthorizeRoleName GetCurrentUserRole(HttpContext context){var user = context.User;var roleClaim = user.Claims.FirstOrDefault(c => c.Type == "RoleName");if (roleClaim != null){// 将 Claim 的 Value 转换为 AuthorizeRoleName 枚举  // 这里需要实现一个转换逻辑,因为 Claim 的 Value 是字符串   if (Enum.TryParse<AuthorizeRoleName>(roleClaim.Value, true, out var role)){return role;}throw new InvalidOperationException("无法确定用户的角色!");}throw new InvalidOperationException("角色信息为空!");}
}

调整获取用户信息接口

在之前的GetUser接口上增加属性标签

[AdminAuthorize(AuthorizeRoleName.Administrator)]

表示只有role为 Administrator 的角色才能访问此接口。

 测试一下!

当GetToken时设置Role为0,即(Administrator )时,获得的token去访问GetUser时是可以的。

设置为其他时,则断点会进入这里,接口返回403

项目代码

该项目的案例源代码我已经上传至gitee,需要的可自取

AuthenticationAndAuthorization: .net Core Web Api的Token生成,JWT签名,验证与授权 (gitee.com)icon-default.png?t=N7T8https://gitee.com/libihao520/authentication-and-authorization

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393451.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s—ingress应用

一、ingress和ingress-controller ingress对象&#xff1a; 指的是k8s中的⼀个api对象/资源对象&#xff0c;⼀般⽤yaml配置。作⽤是定义请求如何转发到service的规则&#xff0c;可以理解为配置模板。 ingress-controller&#xff1a; 具体实现反向代理及负载均衡的程序&…

鸿蒙第三方应用.hap打包、安装流程。

最近在华为手表上安装第三方应用&#xff08;源码打包构建应用&#xff0c;需要签名&#xff09;。网上看了教程&#xff0c;在此记录下。 准备工作&#xff1a;先安装DevEco Studio开发工具。 进入华为 appgallery connect网站&#xff08;注册、开发者实名认证&#xff09; …

【Material-UI】按钮组:按钮变体详解

文章目录 一、按钮变体概述1. 组件介绍2. 基本用法 二、按钮变体详细说明1. 轮廓按钮&#xff08;Outlined&#xff09;2. 文本按钮&#xff08;Text&#xff09;3. 填充按钮&#xff08;Contained&#xff09; 三、按钮变体的实际应用场景1. 界面设计2. 界面一致性3. 视觉层次…

面试笔记 8.5

面试常见: Jvm&#xff0c;高并发&#xff0c;多线程&#xff0c;数据库&#xff0c;redis&#xff0c;框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…

双轮驱动产品持续商业成功

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图

前端(五):前端工程化

前端工程化是指在企业级的前端开发项目中&#xff0c;把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。 一、环境准备 &#xff08;一&#xff09;环境准备 1、Vue-cli&#xff1a;是Vue官方提供的一个脚手架&#xff0c;用于快速生成一个Vue的项目模板。 2、…

myeclipse 2020 下载 安装 汉化

1&#xff0c;解压 myeclipse 2020 压缩包到当前目录下&#xff1a; 点击此处蓝色字体下载压缩包 提取码 k3x9 2&#xff0c;鼠标右键 点击 myeclipse 2020.exe 选择 以管理员身份运行 &#xff1a; 3&#xff0c;等待加载&#xff1a; 4&#xff0c;点击 Next &#xff1a; 5…

正则表达式测试工具

前言 正则表达式测试工具可供您输入正则表达式和测试文本&#xff0c;立即查看匹配结果. 下面是离线的HTML文件,同样可以提供相同的服务. 目录 使用说明 HTML代码 正则表达式的编写经验和方法 总结 使用说明 1.先将HTML代码存储成.html为后缀的文件; 2.然后用浏览器打开这个…

C++空指针(nullptr)

C空指针(nullptr) ​ 在C语言中我们把空指针定义成NULL&#xff0c;但是这在C中会有所问题&#xff0c;因为C对指针类型转换比较严格。下面让我来深入了解一下NULL与nullptr。 NULL实际就是一个宏&#xff0c;在C头文件(stddef.h)中&#xff0c;可以看到如下代码&#xff1a;…

【ML】transform 之 decoder 及其实现细节

【ML】transform 之 decoder 及其实现细节 1. decoder2. encoder 和decoder 之间是如何处理和传递讯息的&#xff1f;self-attention3. 查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;、值&#xff08;Value&#xff09;是三个核心概念及其具体含义和计算方…

二十八、【人工智能】【机器学习】- 隐马尔可夫模型 (Hidden Markov Models, HMMs)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

模型 MBTI(性格模型)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。探索真我&#xff0c;和谐人际。 1 MBTI性格模型的应用 1.1 跨国公司团队协作改进 ABC公司是一家全球性的科技公司&#xff0c;其研发团队由来自世界各地的工程师和设计师组成。尽管团队成员个个才华…

【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

目录 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09;二、不可中断的睡眠状态&#xff08;D深度睡眠状态&#xff09;三、关于S浅度睡眠状态与D深度睡眠状态的理解 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09; S&#xff08;sleeping&#xff09;…

【docker】docker和镜像仓库

阿里云镜像仓库&#xff08;Aliyun Container Registry&#xff09;是阿里云提供的容器镜像存储和管理服务。它以Docker Registry协议为基础&#xff0c;为容器开发者提供了稳定可靠的镜像存储和分发服务。 使用阿里云镜像仓库&#xff0c;您可以将自己的Docker镜像推送到阿里…

sqliabs靶场练习

关卡 熟悉Mqsql相关命令Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10 熟悉Mqsql相关命令 首先先熟悉一下Mysql的相关命令&#xff0c;可能在SQL注入的时候会用到。 1.查询服务器主机信息 HOSTNAME 主机名称 datadir——数据库路径 version_compile_os—…

Golang | Leetcode Golang题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; func wiggleSort(nums []int) {n : len(nums)x : (n 1) / 2target : quickSelect(nums, x-1)transAddress : func(i int) int { return (2*n - 2*i - 1) % (n | 1) }for k, i, j : 0, 0, n-1; k < j; k {tk : transAddress(k)if nums[t…

【Android】四大组件(Activity、Service、Broadcast Receiver、Content Provider)、结构目录

文章目录 Android系统架构Android四大组件ActivityServiceBroadcast ReceiverContent Provider 两大视图主要结构目录 Android系统架构 https://blog.csdn.net/xzzteach/article/details/140904613 Android四大组件 Activity 一个 Activity 包含了用户能够看到的界面&#xff0…

【Web】从TFCCTF-FUNNY浅析PHPCGI命令行注入漏洞利用

目录 背景 CVE-2012-1823 发散利用 法一&#xff1a;读文件 法二&#xff1a;数据外带 背景 CVE-2012-1823 PHP-CGI远程代码执行漏洞&#xff08;CVE-2012-1823&#xff09;分析 | 离别歌 省流&#xff1a; 命令行参数不光可以通过#!/usr/local/bin/php-cgi -d include…

C语言典型例题27

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.4 用下面的scanf函数输入数据 使a3,b7,x8.5,y71.8,c1A,c2a。问在键盘上怎么输入 代码 //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.4 用下面的scanf函数输入数据&#xff0c;使…

卷积神经网络 - 结构化输出篇

序言 卷积神经网络&#xff08; CNN \text{CNN} CNN&#xff09;作为深度学习领域的重要分支&#xff0c;凭借其强大的特征提取与学习能力&#xff0c;在图像和视频处理领域取得了显著成就。其结构化输出的特性&#xff0c;更是为复杂任务的解决提供了有力支持。本文旨在简要概…