【.NETCore 3】Ids4 ║ 多项目集成统一认证中心的思考

 前言

哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/video/av58096866),直播授课(https://live.bilibili.com/21507364)的道路,目前看来效果还算基本及格吧,虽然人气没有那些大佬的多,不过我也是一直很尽心力,包括字幕的录入,每周三定期的讲课,不过真的很累,但是自认为做的还可以了,只是没能申请上MVP🙃。

 

为什么突然想要写文章了呢,我是有强迫症的,目前开源了五个系列的文章,从 NetCore 到 Vue,从 Admin 到 Nuxt,然后从 DDD 到 IdentityServer4,我自认为都是贴近实战的,因为看到某些小伙伴说,应用到了公司的项目里,我也是很开心,而且 NetCore 项目的Github start 数也破千了,我感谢每一个点赞评论的小伙伴,我都是每条评论必回,每个邮件也必回:

640?wx_fmt=png

我自信这一年多以来,对netcore的基础知识已经了解的七七八八了,基本都能回答些,但是每当有人问到 IdentityServer4 的相关内容的时候,我都稍微捉襟见肘,虽然我写了四篇文章,但是因为中间卡了一个心结(具体内容下文会说明),所以没有进行下去,也让自己没有进一步去研究这个框架的动力了,大家肯定都懂那个心理,如果一直有个刺,然后时间长了会刻意回避它。

 

不过最后我还是决定要搞起来,既然说到了要布道,就要走下去,所以我会除了之前的四篇文章外,还再有三到四篇的文章来开启 Ids4 的第二阶段的学习,然后配合还有大概八个视频的讲解,如果你看过我的第一个系列视频教程,应该心里有谱,我第二个系列讲的怎么样,所以我也就不多说了,这两周准备一下,下周末开启视频讲解第二系列。

那下面我们就马上开启今天的这篇文章吧。

 

 

 零、回顾与目标

 

还记得我开启 IdentityServer4 讲解是在半年前,当时我本想是八篇文章,将我的所有项目 —— 主要是 Blog.Admin 和 Blog.Vue 这两个项目统一集成到 Ids4 的网关授权上来,当然有精力也可以把 DDD 和 Nuxt 的认证也添加进来,只不过 DDD 已经用了 Identity 了,这个优先级可以暂时往后放放,然后就写了四篇文章,主要是偏重于实战,而不是讲解那老生常谈的知识点:

 

  • 01 ║ 授权服务器 IdentityServer4 开篇讲&计划书

  • 02 ║ 基础知识集合 & 项目搭建一

  • 03 ║ 详解授权持久化 & 用户数据迁移

  • 04 ║ 用户数据管理 & 前后端授权联调

 

但是在写到了第四篇文章的时候,出现了一个说小不小,说大不大的问题,让我搁置了整整半年,是什么问题,我简单说说:

我看很多博主在讲 Ids4 的时候,基本情况都是用的无状态的认证方式,什么意思呢?

1、就是应用场景都是对应的 [Authorize] 这种只要登录了就可以的项目里,没有涉及到复杂的策略授权,比如角色和模块;

2、然后你可能也会说,“ 我看到他们文章讲解中生成的 token 中,可以自定义 Role 到 Claim 里呀,你直接在 Blog.Core 项目获取到 Role 进行策略授权不就行了”,你说的没错,但是这里有一个后续问题;

3、那我的 Role 信息在哪里管理?是在 Blog.Ids4 (认证服务)项目,还是在 Blog.Core (业务资源服务)项目里?

这里你可以稍微暂停一下,暂停五分钟,自己想一想,如何去解决这些问题,特别是第三个问题。

如果你把 Role 的信息管理放到了 Blog.Ids4 项目里,那 Blog.Core 如何针对 Role 进行匹配 Url进行授权配置呢?

但是如果把 Role 管理放到了 Blog.Core 项目里,那就没有办法根据 UName 和 Pwd 生成 token 的时候,在 Claims 里生成 Role 信息了。

 

这个并没有那么简单哟,当然如果你们公司开发过,可以直接看下文,和我想的方案对比下,如果有出入,或者你的更好,我热烈欢迎提出批评和指导建议,好了,那我就说说我的三种思路吧。

 

 一、无状态的简单授权认证

 

这种方案呢,刚刚我们在上文已经说到了,我也已经实现了,就是在文末我的项目中,已经实现这个了, 就是 Blog.Ids4 只单单提供认证功能,不用管 Role 的相关声明 Claims,基本都是对应的前台项目,比如我们的博客项目和电商项目,用户登录了就行,就可以直接发文章或者购买商品了,不用理睬具体啥页面不能访问,这个就不多说了,很好理解。

这种场景,很好解决,认证服务项目和资源服务项目 相互独立,没有交际,只是提供一个认证网关的作用,这里就不多说了。

 

但是这种情况有时候并不是很多,或者说是少数的,我们更多的,还是需要在 token  中携带 role 的 claim 声明,特别是后台管理系统,都是有状态的授权,比如我们的 Blog.Core 是比较复杂的策略授权,那这个时候就需要讨论一下数据库的问题了,其实重点还是讨论 Role 表是在哪个项目维护的问题。

 

 

 二、有状态的授权认证中心

 

那么问题就来了,我们为了满足复杂的策略授权,就需要在 Blog.Core 项目里将 Role 和 Url/Api 进行匹配映射到数据库,那就必须用 Role 表。

但是我们上边也讨论很多了,我们必须要在 token 中携带 Role 的Claim,那就必须放到 Blog.Ids4 项目里维护 Role。

这个时候是不是发现两种情况很矛盾,为了达到这个项目,我简单看了看 ABP 项目,这个还是群管理 @Kawhi 提的建议,我得到了一丝丝的想法,ABP项目是把认证和资源服务合并到了一起!

 

 1、认证数据库与业务数据库合二为一

 

这个我最终决定采用的方案,具体代码我已经慢慢的在 Ids4 项目里迁移修改了,感兴趣的可以看看,其实说白了,就是把 EFCore 生成表结构的数据库,指向 Blog.Core 项目的就行了,然后这个时候,我们就看到了两个 Role 表:

640?wx_fmt=png

 

那既然我们的 Ids4 项目用的是 AspNetRoles 来进行认证的,我们直接用这个表不就好了?!,舍弃下边的 Role 表,用上边 Ids4 自带的 AspNetRoles 表,来和我们的 Module 和 Permission 表就行授权映射匹配,这样是不是完美的解决了我们上边出现的所有问题!

 

然后我们的 User 管理和 Role 管理,都移交到了 Ids4 项目里,从而使得我们的 Blog.Coe 资源服务器只需要踏踏实实的做授权就行了:

640?wx_fmt=png

 

 

这个不用担心看不懂,我在后边的文章和视频中也会详细说到,本文主要说的是这个思路,具体业务逻辑和代码,我会详细讲解的,你能看懂我的意思就行。 

这样是不是很好的解决了 Role 管理的问题,而且可以快速的将 Blog.Admin 和 Vue 项目给切换过来,很简单。但是,万事就怕但是😂,这里有一个问题,就是如果我有多个资源服务器怎么办,多个资源服务器肯定是不能和一个认证数据库合并的,比如我的项目结构是这样的:

640?wx_fmt=png

 

 

这种我们是不好去把 资源服务器和 认证中心的数据库放到一起的,当然这种微服务的方案也不是这么玩儿的,我以后会继续说到这种情况,如何来设计。

咱们先不说微服务,就说单一服务,那如果不能数据库合并,又想保证 Role 的良好维护,我想了不是很好的办法,一共分两种情况。

 

 2、认证DB与资源DB分离,两个Role表

既然不放到一起,那就分离开,还是我目前项目 Github 上的情况,两个数据库,两个 Role 表 ,但是呢,对 Role 的管理,还是放到 Ids4 服务器,

只不过这个时候,需要在资源服务器 Blog.Core 里,写一个定时器或者服务,将 Ids4 Db 中的 AspNetRoles 表数据,统一导入到 Blog.Core Db 的 Roles 表中,然后我们在资源服务器还是来操作 Roles 表,基本我的资源服务器修改的代码很少,只是多了一个数据同步的方法而已,

相对于上边的方案,这个优点是:

1、代码改动小;

2、多个资源服务器可以共存,共用一个认证中心;

3、防止因为 IdentityServer4 官方更新,而破坏我们的资源服务代码,侵入性小。

 

缺点也是有的,就是比较 low,而且不能保证实时性,更新速度受到定时器的限制。那和老李讨论一下,他给的建议是,可以在不使用表同步,而使用接口的形式,请往下看。

 

 3、认证DB与资源DB分离,一个Role表

这种方案,最终被我 PASS 了,思路我简单说下,其实很简单,就是我们的资源服务器 Role 表弃用,整个项目统一用 Ids4 认证服务器提供一个对外暴露的 GetRoles 的 api 接口,来保证实时性和统一性,

但是这样缺点太明显,受官网的限制,而且对资源服务器的侵入性太强,尽管可以封装一个方法。

说这个的目的,只是想让大家集思广益,开拓思维,学习都是思考的过程。

 

 

 

 三、其他方案

 除了我上边提出来的一些方案,如果你有什么想法,或者好的注意,可以文章下边留言或者评论,不胜感激,比如:

1、@老张说:不在资源服务器里进行数据库的映射匹配,全部写到Controller控制器的特性上的角色或模块授权[Authorize(Roles = "Admin,Client")],这样也能解决。

2、???

 

期待你的热评! 

 

 

四、Github && Gitee

 

https://github.com/anjoy8/Blog.IdentityServer

 

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

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

相关文章

.NET 社区 NB,2019 中国 .NET 开发者峰会

点击蓝字关注我们作为广州 .NET 技术俱乐部的一名成员,很荣幸以志愿者的身份见证并参与了 首届社区组织的中国 .NET 开发者峰会 ,这次大会共分为三天,第一天的 .NET 之夜,第二天的 .NET 开发者峰会,第三天的 .NET Core…

SQL Server 中 JSON_MODIFY 的使用

SQL Server 中 JSON_MODIFY 的使用IntroSQL Server 从 2016 开始支持了一些 JSON操作,最近的项目里也是好多地方直接用字段直接存成了 JSON,需要了解一下怎么在SQL Server 中操作 JSON.JSON支持适用于 SQL Server 2016 及以上版本 和 Azure SQL Database…

TypeScript 3.7稳定版发布

TypeScript 3.7 发布了,此版本带来了许多新特性。Optional Chaining首先一大亮点是 Optional Chaining,这是社区呼唤特别强烈的一个 ECMAScript 特性。最初它是 TypeScript 的 issue 跟踪器上第 16 个 issue,于 5 年前提交,要知道…

.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化, TypeScript越来越流行,前端的设计也越来复杂,而 类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式。许多工具都能生成 C#类图,有些工…

阅读源码学设计模式-单例模式

有些编码套路是公认的,大家都参照其编写符合可观赏性的代码,那就是设计模式现在.NETcore 默认提供了DI功能,那我想设计一个全局的引擎类,进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一,其他地方不能进…

我终于知道post和get的区别

IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。码农:你知道get和post请求到底有什么区别&am…

【译】使用Blazor构建桌面应用

随着最近.NET Core 3的正式发布,我认为我会尝试一个有趣的小实验。我喜欢使用Electron来创建基于Web的桌面应用程序。我想了解有关Blazor(ASP.NET系列的最新成员)的更多信息。在这篇文章中,我将向您确切演示如何在15分钟内开始使用…

CAP的学习和应用

前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧一.CAP使用场景?平时工作中经常使用到MQ,如(kafka,rabbitmq...),用来简单的发布/订阅,经常会遇到以下几个问题常用方案,把SQL放前面,MQ放后面,MQ执行失败了,我们把整个SQL进行回滚,这种方案在单应用…

[功能发布]Excel催化剂地图可视化功能正式发布,欢迎使用!

地图可视化功能开发完成已过去1个多月,文章的阅读量与初定传播目标相差甚远。但因着热爱分享的缘故,在阅读量未及预期时,仍然破例对其功能进行发布。若真正喜爱Excel催化剂所开发的地图可视化,可通过完成小任务来获取使用资格。再…

WebAssembly生态将完善网络安全性

近日 Mozilla、Fastly、Intel 与 Red Hat 宣布成立联合组织 Bytecode Alliance(字节码联盟),该联盟旨在通过协作实施标准和提出新标准,以完善 WebAssembly 在浏览器之外的生态。WebAssembly 也叫 Wasm,它是为基于栈的虚…

我们终于可以把 bug 留给子孙后代了

“ 阅读本文大概需要 4 分钟。 ”今天在聊项目之前,我们先来聊一下历史。中学时候拿到的第一本历史书,上面是从智人的起源讲起的,他轻轻掠过尧舜禹,秦始皇统一六国,千古一相李斯。他喊二川溶溶,流入宫墙。五…

30分钟无坑部署K8S单Master集群

Jesse导读:11月9号,我在中国.NET开发者峰会(.NET Conf China 2019)上分享了之前ASP.NET Core和Kubernetes做微服务的经验,在10号的时候又联合张善友、陈计节两位大佬一起做了一个6个小时的动手实践,得到了非常好的反馈…

亲自实践Blazor构建桌面应用程序

首先是安装.NET Core 3.0 与Node.js.Net Core 版本为:3.0.100Node.js安装版本为:v12.13.0用到的8个命令mkdir blazor-electron-democd blazor-electron-demodotnet new blazorserver --no-httpsdotnet add package ElectronNET.APIdotnet new tool-manif…

行云万里,转型未来 | 行云创新受邀参加2019中国.NET开发者峰会

2019 年 11 月 9 日,中国 .NET 开发者峰会(.NET Conf China 2019)在上海拉开帷幕,这是中国 .NET 社区的年度盛会。行云创新受邀参加了此次峰会,为当前最热门的科技专题带来了精彩的演讲,与全国的 .NET 开发…

西安活动 | 云时代,享未来 .NET 线下沙龙

活动介绍:在云时代到来的今天,越来越多的应用已经依赖于云而构建,这正得益于云给软件开发带来的低成本,易扩展,可重用的便捷之处。.NET Core平台就是为云而诞生的,毫无疑问它是构建云应用的首要之选。已经磨练5年时间&…

.NET手撸绘制TypeScript类图——下篇

.NET手撸绘制TypeScript类图——下篇在上篇的文章中,我们介绍了如何使用 .NET解析 TypeScript,这篇将介绍如何使用代码将类图渲染出来。类型定义渲染不出意外,我们继续使用 FlysEngine。虽然文字排版没做过,但不试试怎么知道好不好…

China .NET Conf 2019-.NET技术架构下的混沌工程实践

这个月的8号、9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题《.NET技术架构下的混沌工程实践》,给广大的.NET开发小伙伴介绍混沌工程和高可用性改造实践。会后大家伙聚餐的时候,陈计节老师建…

分布式应用框架 Dapr

微服务架构已成为构建云原生应用程序的标准,微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统。为了使用所有开发人员能够使用任何语言和任何框架轻松…

.NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

更新记录:-- 2019-11-16 增加Docker容器监控系列文章// 此外,今天是11月17日,我又老了一岁,祝我自己生日快乐!近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给…

身边的设计模式(一):单例 与 RedisCacheManager

大家好,以后我会用23篇文章,来给大家讲解设计模式,当然如果你看过我的项目,很多设计模式已经很会了,只是没有注意到,我这里会讲解一下,大家就会发现,如果你看懂了我的项目&#xff0…