【实战 Ids4】║ 认证中心之内部加权

本期配套视频:

https://www.bilibili.com/video/BV1sJ41197af?p=9

(昔我往矣,杨柳依依,今我来思,雨雪霏霏)

1、为什么需要在认证内部加权

我们知道,认证中心的作用就是用来保护我们的资源服务器,所以说认证中心是一个保护者,当然,他在保护其他客户端的时候,也需要对自己进行保护,举例来说:

我的Ids4项目中,有用户角色信息管理,客户端数据管理等等,这些不可能让普通的登录用来来访问的

因此我们同样需要在认证中心内部实现加权处理,用来保护某些页面或者说某些数据的安全性不被恶意攻击或访问。

当然除了不让普通用户访问,我们也同样为了区分公司内部管理员的身份和权限,也同样需要如此,超级管理员有很高的权限,可以处理任意数据。

这就是为什么我们需要在认证中心内部进行权限管理的原因。

2、常见的加权方式有哪几种

这个问题不仅仅是在认证中心,其实在任何的项目中,包括资源服务器中,我们也是常用这几种权限处理方式,多数是基于角色控制的RBAC模式

这几种我都使用过,也都是各有利弊的,我在资源服务器Blog.Core中,用的是第④种,而这次在认证中心Blog.IdentityServer中,使用的是第③种。

第四种是最复杂的,保存到数据库,可以实现动态的策略授权,我们通过配置数据库,就可以针对任意一个页面或者API进行控制,但是在认证中心中,有些过于复杂了,故暂时不用。

第一种是无状态的,任意登录的用户都能访问,起不到控制的作用,仅仅是起到防止那些访客任意访问的作用,故舍弃。

第二种其实和第三种是一样的代码,我举例来说明:

  services.AddAuthorization(options =>{options.AddPolicy("Admin", policy => policy.Requirements.Add(new ClaimRequirement("rolename", "Admin")));options.AddPolicy("SuperAdmin", policy => policy.Requirements.Add(new ClaimRequirement("rolename", "SuperAdmin")));});services.AddSingleton<IAuthorizationHandler, ClaimsRequirementHandler>();

从代码中,我们可以看到,我虽然创建了一个简单的策略,但是逻辑却是获取rolename角色名,判断各自的角色,那我为啥不直接用第二种呢:

这样岂不是更简单,也不用写处理器等逻辑了,直接这么写一下即可。

下边我会讲为什么没有用这个。

3、你的资源服务器是如何加权的

你可能会好奇,今天说的是认证中心的加权,为啥又说到了资源服务器?是不是多此一举了,并不是,其实我们写的每一行代码都应该考虑下,是否对其他的有影响,是否对其他的项目有关联,今天说的认证中心也是,我先给大家回忆一下Blog.Core的资源服务器是如何权限控制的。

Blog.Core中,用到的是上面说的第四种,复杂数据库的策略授权,我们把数据都配置到了数据库中,通过角色+菜单+接口的三方约束,来实现当前用户是否有权利访问当前接口

细心的你可能发现了,这个多对多的关系表中,我们用到的是RoleId,那这个Id是从哪里来的,肯定是从Ids4认证中心来的,毕竟用户是在那里统一登录注册。

那是如何传递过来的,肯定是Token,进一步说明,是Token中的Cliams声明,那我们继续往前推,这个声明是从哪里配置的?是这里:

这里用SeedData来举例,生成种子数据的时候,我们把角色Id赋给了JwtClaimTypes.Role的Cliams节点,这个是一个常量,也就等于是role这个节点。

这样的话,我们Token中的声明中的role节点,其实就是我们的角色Id,那上边反推的逻辑就成功了,我们再来总结下:

用户登录——>获取token——>携带roleid——>资源服务器HttpContext解析token

——>得到roleid——>根据roleid获取到指定的菜单mid和接口pid集合——>在策略授权中做逻辑判断。

看似一切很合理,但是却有一个问题,因为我Blog.Core是先开发的,所以假设我们的这个资源服务器代码不改的话,认证中心就有了一点儿小问题

4、认证中心的抉择

当前我们的角色信息是用的id,那认证中心就不能使用第二种方案了:

[Authorize(Roles = "AdminTest")]

因为这个时候,我们claims声明中,获取到的不是name,所以一定会失败,就算当前用户的角色真的是AdminTest,还是会失败:

这是因为按照这种方案,它只认识role这个节点,但是这个节点是id,没办法,我们只能这么写了:

虽然是通过了,但是看着还是感觉很不舒服,有点儿Bad Smell的意思。

所以这也就是我文章开头说的,我为啥要新建了一个策略,使用rolename节点作为策略的原因了:

 protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,ClaimRequirement requirement){var claim = context.User.Claims.FirstOrDefault(c => c.Type == requirement.ClaimName);if (claim != null && claim.Value.Contains(requirement.ClaimValue)){context.Succeed(requirement);}return Task.CompletedTask;}

5、总结

今天虽然讲的是认证中心的加权处理,但是我们也要考虑到资源服务器的业务逻辑,

最终我还是采用的是:

资源服务器用roleid来配合菜单和接口id,实现权限分配;

认证中心采用策略方案,通过rolename来对页面进行权限控制;

到此结束,Ids4实战也告一段落了,很有意思也很能锻炼人思维逻辑的一个框架,建议大家好好学习,不可中途放弃,加油。

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

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

相关文章

C++ class实现链队列(完整代码)

代码如下: #include <iostream> using namespace std; typedef int ElemType;class QueueNode {friend class LinkQueue;public:QueueNode(): next(NULL) {};private:ElemType data;QueueNode *next; };class LinkQueue {public:LinkQueue(): front(NULL), rear(NULL) {…

CDN加速小水管动态应用技巧

不得不说现在大陆和HK的云主机都是小水管模式&#xff0c;由于硬件的快速发展在这种小水管的情况下很难发挥出用户硬件资源的能力&#xff0c;当然可以加水管但费用很高&#xff0c;更多时候会浪费带宽&#xff1b;这个时候我们想到CDN加速&#xff0c;这种资源的好处就是可以把…

C++ class实现二叉树(完整代码,附非递归遍历)

代码如下: #include <iostream> #include <stack> #include <queue> using namespace std; typedef char ElemType; int InOrder_count 0;class BinTreeNode {friend class BinaryTree;public:BinTreeNode(): lchild(NULL), rchild(NULL) {};private:ElemT…

服务器水冷系统仿真,水冷漫谈(三)——水冷散热器仿真方法

水冷散热器的精细化设计是需要借助仿真软件的。目前可以完成水冷仿真的商业软件有很多种&#xff0c;各有优势&#xff0c;在此不做对比。Jason用的是FloTHERM&#xff0c;但是主要的分析方法是一致的。不同于风冷的系统&#xff0c;水冷整个系统比较庞大和复杂。工程中一般不会…

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

在这篇文章中&#xff0c;我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业。这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态。接下来我将演示如何创建一个简单的 IJob&#xff0c;一个自定义的 IJobFactory和一个在应用程序运行时就开…

分享一些支持多租户的开源框架

如果你在开发sass应用程序&#xff0c;可以参考或者直接使用这些开源的框架。ASP.NET Boilerplate — Web应用程序框架ASP.NET Boilerplate是专门为新的现代Web应用程序设计的通用应用程序框架。它使用已经熟悉的工具并围绕它们实施最佳实践&#xff0c;以为您提供SOLID开发经验…

服务器操作系统用什么好,服务器操作系统一般用什么

服务器操作系统一般用什么 内容精选换一换客户的SAP系统部署在第三方云&#xff0c;服务器操作系统在华为云支持的列表内&#xff0c;数据库为任意数据库&#xff0c;同时还有如对象存储等的其他云服务。迁移到华为云后&#xff0c;数据库以及操作系统保持不变&#xff0c;系统…

一张大图了解ASP.NET Core 3.1 中的Authentication与Authorization

下面是一张ASP.NET Core 3.1 中关于Authentication与Authorization的主流程框线图&#xff0c;点击这里查看全图&#xff1a;https://johnnyqian.net/images/202004/aspnet-core-3.1-request-processing-pipeline.png重要组件一些重要的组件及其源码链接如下&#xff1a;Authen…

C++ class实现完全二叉树的顺序存储结构

代码如下: #include <iostream> using namespace std; const int maxsize 100; typedef char ElemType;class QbTree {public:void CreateBTree(int n);int vislchild(int i);int visrchild(int i);int visparent(int i);ElemType viselem(int i);void LevelOrder();p…

研发协同平台持续集成Jenkins作业设计演进

源宝导读&#xff1a;Jenkins作为一个开源的持续集成工具&#xff0c;被大家广泛使用。本文将分享&#xff0c;Jenkins在明源云研发协同平台中的运用&#xff0c;以及在其作业设计方面的演进历程。一、作业设计1.0起初&#xff0c;为了尽快推出研发协同平台v1.0&#xff0c;我们…

一切都要从华为云 CloudIDE 酷似 VS Code 说起

前不久&#xff0c;有个关于华为云 CloudIDE 的问题在知乎、朋友圈、微博等圈子引起了广泛的讨论&#xff0c;甚至上了知乎热榜。那么&#xff0c;背后的真实情况到底是如何的&#xff1f;且听韩老师娓娓道来。华为云 CloudIDE 酷似 VS Code&#xff1f;首先要明确一点&#xf…

C++ class实现双亲表示法

#include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class TreeNode {friend class Tree; private:ElemType data;int parent; };class Tree { private:TreeNode elem[MAXSIZE];int n;//树中当前的节点个数 }Tree;

单元测试:如何编写可测试的代码及其重要性

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者&#xff1a;谢尔盖科洛迪&#xff08;SERGEY KOL…

C++ class实现孩子表示法

代码如下: #include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class link {friend class Node; private:int child;link *next; };class Node {friend class Tree; private:ElemType data;link *first; };class Tree { private:…

IdentityServer 部署踩坑记

IdentityServer 部署踩坑记Intro周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目&#xff0c;踩了几个坑&#xff0c;在此记录分享一下。部署架构项目是基于 IdentityServerAdmin 项目修改的&#xff0c;感谢作者的开源付出&#xff0c;有需要 IdentityServer 管…

.Net Core微服务架构技术栈的那些事

一、前言大家一直都在谈论微服务架构&#xff0c;园子里面也有很多关于微服务的文章&#xff0c;前几天也有一些园子的朋友问我微服务架构的一些技术&#xff0c;我这里就整理了微服务架构的技术栈路线图&#xff0c;这里就分享出来和大家一起探讨学习&#xff0c;同时让新手对…

C++ class实现Huffman树(完整代码)

代码如下: #include <iostream> #include <string> using namespace std; const unsigned int n 8;//字符数NUM&#xff0c;这里的字符数为8 const unsigned int m 2 * n - 1;//结点总数 const float MAX 1e8;class HTNode {friend class HuffmanTree; private…

二叉树的遍历(堆栈)

二叉树的遍历&#xff08;堆栈&#xff09; 如何理解用堆栈方式代替递归去遍历二叉树&#xff0c;关键点在于了解每个结点输出时的顺序&#xff0c;以及理解前序中序后序是如何遍历的&#xff0c;这点很重要&#xff0c;可以自己画一个树图&#xff0c;熟练写出遍历的结果 以…

ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

任务10&#xff1a;第三方ClientCredential模式调用创建一个控制台程序dotnet new console --name ThirdPartyDemo添加 Nuget 包&#xff1a;IdentityModel添加之后还原dotnet restoreClientusing System; using System.Net.Http; using System.Threading.Tasks; using Identit…

C++ class实现邻接矩阵存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int VertexType; typedef int EdgeType; const int MaxVertexNum 30;class MGraph { public:MGraph(){CreatGraph();};void CreatGraph();void Visit(int v);void BFS(int v);void…