ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权。涉及到的例子也以上一章的为基础。(ASP.NET Core 系列目录)

首先说一下认证(authentication)与授权(authorization),它们经常在一起工作,所以有时候会分不清楚。并且这两个英文单词长得也像兄弟。举例来说,我刷门禁卡进入公司,门禁【认证】了我是这里的员工,可以进入;但进入公司以后,我并不是所有房间都可以进,比如”机房重地,闲人免进”,我能进入哪些房间,需要公司的【授权】。这就是认证和授权的区别。

ASP.NET Core提倡的是基于声明( Claim)的授权,关于这个Claim,上一章用到过,有如下这样的代码,但没有介绍:

这是一个声明的集合,它包含了两个 声明,用于保存了用户的唯一ID和用户名。当然我们还可以添加更多的Claim。对应Claim,还有ClaimsIdentity 和ClaimsPrincipal 两个类型。

ClaimsIdentity相当于是一个证件,例如上例的门禁卡;ClaimsPrincipal 则是证件的持有者,也就是我本人;那么对应的Claim就是门禁卡内存储的一些信息,例如证件号、持有人姓名等。

我除了门禁卡还有身份证、银行卡等,也就是说一个ClaimsPrincipal中可以有多个ClaimsIdentity,而一个ClaimsIdentity中可以有多个Claim。ASP.NET Core的授权模型大概就是这样的一个体系。

ASP.NET Core兼容之前的角色授权模式,如何使用呢?由于不是本文的重点,这里只是简要说一下。修改FlyLolo.JWT.Server的TokenHelper临时为张三添加了一个名为”TestPutBookRole”的权限(实际权限来源此处不做展示)。

修改FlyLolo.JWT.API的BookController,添加了一个Action如下

访问这个Action,只有用张三登录后获取的Token能正常访问。

对于上例来说,本质上也是基于声明(Claim)的授权,因为张三的”TestPutBookRole”角色也是作为一个Claim添加到证书中的。只不过采用了特定的ClaimTypes.Role。那么是否可以将其他的普通Claim作为授权的依据呢?当然是可以的。

这里涉及到了另一个单词”Policy”,翻译为策略?也就是说,可以把一系列的规则(例如要求姓名为李四,账号为002,国籍为中国等等)组合在一起,形成一个Policy,只有满足这个Policy的才可以被授权访问。

下面我们就新建一个Policy,在Startup的ConfigureServices中添加授权代码:

在BookController中添加一个Action如下

可以通过张三和李四的账号测试一下,只有使用张三的账号获取的Token能访问成功。

上面介绍了两种授权方式,现在有个疑问,通过角色授权,只适合一些小型项目,将几个功能通过角色区分开就可以了。

通过声明的方式,目测实际项目中需要在Startup中先声明一系列的Policy,然后在Controller或Action中使用。

这两种方式都感觉不好。例如经常存在这样的需求:一个用户可以有多个角色,每个角色对应多个可访问的API地址(将授权细化到具体的Action)。用户还可以被特殊的授予某个API地址的权限。

这样的需求采用上面的两种方式实现起来都很麻烦,好在ASP.NET Core提供了方便的扩展方式。

1.样例数据

将上面的需求汇总一下,最终可以形成如下形式的数据:

涉及到的两个类如下:

2.自定义处理程序

下面就是根据样例数据来制定相应的处理程序了。这涉及到IAuthorizationRequirement和AuthorizationHandler两个内容。

IAuthorizationRequirement是一个空的接口,主要用于提供授权所需要满足的”要求”,或者说是”规则”。AuthorizationHandler则是对请求和”要求”的联合处理。

新建一个PermissionRequirement实现IAuthorizationRequirement接口。

很简单的内容。它的”要求”也就是用户的权限列表了,用户的权限列表中包含当前访问的API,则授权通过,否则不通过。

判断逻辑放在新建的PermissionHandler中:

逻辑很简单不再描述。

3.使用自定义的处理程序

在Startup的ConfigureServices中添加授权代码

将BookController的Delete Action修改一下:

测试一下只有李四可以访问这个Action。

Original: https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_27.html
Author: FlyLolo
Title: ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

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

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

(0)

大家都在看

  • Shell脚本监控线上端口服务是否正常开启

    前言: 线上服务正常可用是至关重要的,当正在运行的某个端口服务异常停止,我们期望定时脚本可以自动启动,而无需遇到问题再人为的启动。 例如:监听Mysql服务是否正常,我们通常的思路…

    Linux 2023年5月28日
    089
  • 附034.Kubernetes_v1.21.0高可用部署架构二

    kubeadm介绍 kubeadm概述 kubeadm功能 本方案描述 部署规划 节点规划 主机名配置 变量准备 互信配置 环境初始化 部署高可用组件 HAProxy安装 Keep…

    Linux 2023年6月13日
    0202
  • Git基本使用命令

    Git配置 Git最小配置 配置全局账户,该账户对所有Git仓库都有效 git config –global user.name ‘账&#x6237…

    Linux 2023年6月13日
    070
  • QLabel图片自适应

    故事背景:由于要做终端定制的需求,在服务端上传一张128像素的图片,下发给客户端,适配所有图标(界面左上角、任务栏、快捷方式、托盘等),但是由于每个位置的图标大小不一样,代码要根据…

    Linux 2023年6月13日
    075
  • linux 使用mailx发送邮件

    1.安装对应的工具 [root@CentOS7 ~]# yum install postfix mailx -y [root@CentOS7 ~]# systemctl enabl…

    Linux 2023年6月7日
    088
  • Linux之Keepalived高可用

    一、高可用介绍 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。 硬件通常使用:F5 软件通常使用:Ke…

    Linux 2023年5月27日
    0103
  • 剑指offer计划29(动态规划困难)—java

    1.1、题目1 剑指 Offer 19. 正则表达式匹配 1.2、解法 动态规划后面再研究 1.3、代码 class Solution { public boolean isMat…

    Linux 2023年6月11日
    099
  • cpp-变量

    1.枚举类型 枚举类型是用户自定义的类型,在定义时要列举出该枚举类型所有的数值。 定义格式如下: [enum] enumName {val1, val2, val3} 其中的通常为…

    Linux 2023年6月7日
    083
  • 事务与事务隔离级别详解

    事务基本概念 一组要么同时执行成功,要么同时执行失败的SQL 语句。是数据库操作的一个执行单元。 事务开始于: 连接到数据库上,并执行一条DML 语句in sert 、update…

    Linux 2023年6月14日
    092
  • python入门基础知识一(基于孙兴华python自动化)

    print(‘aaa’)等价于print(“aaa”) 英文单引号和双引号在字符串的输出上并无区别,但如果要打印这么一段话:I&#8…

    Linux 2023年6月7日
    084
  • IDEA 构建 mybatis 源码

    mybatis 源码构建 mybatis-source 下载 mybatis源码下载 mybatis-parent 版本信息 mybatis-parent 下载 mybatis-p…

    Linux 2023年6月13日
    084
  • Qt-Vnc远程

    VNC简介 VNC(Virtual Network Computing)是基于RFB(Remote Frame Buffer)协议的远程系统,C/S端口默认为5900,B/S端口默…

    Linux 2023年6月8日
    0481
  • Ubuntu下交换Alt和Ctrl (适用于任何按键修改)

    在 Ubuntu 下交换 Alt和 Ctrl键: sudo vim /usr/share/X11/xkb/keycodes/evdev 或使用系统默认编辑器打开: [En] Or …

    Linux 2023年5月27日
    093
  • 普通 Docker 与 Kubernetes 对比

    Docker提供基本容器管理 API 和容器镜像文件格式Kubernetes 管理运行容器的(物理或虚拟)主机群集,如果 Docker 是 OCP 的”内核&#8221…

    Linux 2023年6月6日
    081
  • 个人超级计算机

    这篇文章是回答一位用户的问题。 问:站长,我是一个在读研究生,正在学习分布式计算、高性能集群计算方面的知识,Laxcus分布式操作系统也是我的学习模板之一,但是我发现,无论是编程开…

    Linux 2023年6月6日
    081
  • 新年伊始我的centos8没法更新了

    22年春节后centos8竟然没法更新了,提示 No URLs in mirrorlist如下: yum update Repository extras is listed mo…

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