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)

大家都在看

  • Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim 所有系统用户在启动Vim时,都会加载这个配置文件。…

    Linux 2023年6月13日
    099
  • shell echo单行和多行文字定向写入到文件中

    单行文本: #!/bin/bash echo "192.168.85.24 tsedb">> /etc/hosts 多行文本: < #!/bi…

    Linux 2023年5月28日
    098
  • PHP 通过两个日期计算年龄

    参数:$birth_year:出生年份;$birth_month:出生月份;$birth_day:出生日 function getAgeByBirth($birth_year,$b…

    Linux 2023年6月7日
    0117
  • SpringBoot 搭建基于 MinIO 的高性能存储服务

    1.什么是MinIO MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应…

    Linux 2023年6月7日
    0110
  • MS17-010复现

    一、环境准备 功击方:kali (192.168.43.132) 目标机:win7(192.168.43.134) win7打开smb服务 漏洞的产生: Sbm服务 445端口 二…

    Linux 2023年6月7日
    086
  • linux防火墙设置

    linux防火墙配置,开启/关闭防火墙服务,开放/禁止端口。 linux防火墙设置 环境:ubuntu 20.04 服务设置 开启防火墙 sudo ufw enable 查看防火墙…

    Linux 2023年6月13日
    0115
  • 手套—牛客网

    left[i] 和right[i] 是匹配的数值 0 和 1 左边0个 右边1个 因为数据中有0这种数值 说明有不能匹配的手套。所以这些手套必须加上 避免没有全拿时 拿到了不匹配的…

    Linux 2023年6月13日
    0105
  • jmeter之数据库连接JDBC安装与使用

    jmeter中如果要用sql语句查询数据库,就需要用到JDBC请求和JDBC Connection Configuration了。 首先来了解下,JDBC是什么?英文全称为Java…

    Linux 2023年6月8日
    0132
  • 【Leetcode】768. 最多能完成排序的块 II

    arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个”块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 …

    Linux 2023年6月6日
    0106
  • Python之NMAP详解

    NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些…

    Linux 2023年6月14日
    0145
  • Lvs

    Lvs Lvs Lvs简介 体系结构 LVS管理工具 配置 lvs-nat 模式的 httpd 负载集群—http 配置lvs-nat模式的httpd负载集群&#821…

    Linux 2023年6月6日
    0132
  • 编程入门之日志聚合系统

    (关心具体部署的同学,可以移步我的另外一篇《Centos部署Loki日志聚合系统 》https://www.cnblogs.com/uncleguo/p/15975647.html…

    Linux 2023年6月13日
    097
  • [20211213]提示precompute_subquery.txt

    [20211213]提示precompute_subquery.txt –//学习了提示precompute_subquery,提示很明显就是先计算子查询的结果集,直接…

    Linux 2023年6月13日
    0115
  • Linux查看服务器内存、磁盘、cpu、网络占用、端口占用情况

    1、查看物理CPU个数:cat cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l2、…

    Linux 2023年6月13日
    0146
  • Linux下如何彻底删除(卸载)MySQL?

    工具: CentOS 7 Mysql Xshell 首先连接操作系统,切换到root用户。 如果是使用yum安装的mysql,使用如下命令进行卸载(不能确定使用何种方式安装的mys…

    Linux 2023年6月8日
    0110
  • 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人。从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6…

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