【Ids4实战】最全的 v4 版本升级指南

(恰似一江春水向东流)

最近听说IdentityServer4从v3升级到v4了,其实很简单,就是nuget包升级一下的事儿,不过没想到涉及到的内容还挺多,要不然也不会直接从3.1直接蹦到4.0,这么大的跨度,证明已经涉及到核心的类做了修改。

不要抱怨一直修改,毕竟已经很多人写了更新文档了,软件系统就是一直更新的过程。当然,如果不更新使用v3也可以,功能几乎都是一样的,但是我更喜欢更新到最新版本。相关代码已经放到了项目的4x分支(如果没有,说明已经上线,并迁到主分支了):

已经通过docker部署好了,现在大家看到的online效果,就是4x版本的。那下边就快速说说更新过程吧,放心,前方安全,并没有涉及到什么看不懂的原理。

最终更新的文件这么多:

01

PART

升级依赖包

升级肯定要从nuget包开始,以下这几个就是我认证中心项目使用的nuget包,一键升级全部,可以看到都是最新的了:

(升级nuget包)

操作确实是很简单,操作也在预料之中,只不过没想到会这么多(其实更多,因为这里仅仅是编译下的Errors,有些页面内的还没有被编译到):

那下边就开始动手迁移吧,再问一下自己,是否准备好了,3x版其实也可以。

02

PART

寻找模板

以下的是我的摸索历程,毕竟我看的代码和文章基本都是3x的。

01

更新官方模板

上边我们仅仅是更新了Ids4的核心库,我想象着官方既然更新了核心库,那他们的模板库已经也已经更新了,然后就卸载了这几个模板,又重新安装了一次:

相关的安装命令是这样的:

// 安装模板
dotnet new -i IdentityServer4.Templates
// 初始化项目
dotnet new is4admin --name Idp

因为我用的是快速启动项目,所以就直接生成了一个is4admin的项目,发现,事情并没有我想象的那么简单,他们基本还是3x版本的。

其实有一个是4x版本的,就是is4inmem版本的:

dotnet new is4inmem --name Idp

他这个是4x版本的,只不过是内存模式的,有很多地方还是和我们的不一样,没办法,只能寻找官网了。

02

查看源码

其实官方的源码很多也都还是3x版本的,毕竟模板都是这样,直接用文件查找的方式,一一的点开来看,最终还是找到了:

https://github.com/IdentityServer/IdentityServer4/tree/main/src/AspNetIdentity/host/Quickstart

当然官网有很多地方,最终我是在host文件夹下,才发现了4x版本的快速启动代码,然后开始针对错误一一的处理,主要的修改的地方有以下几个部分。

03

PART

主要修复部分

01

DB上下文部分

其实大家根据上边的报错一一修改就行了,我这里简单的列举下,心里有个谱。

本次升级到4x,数据库发生了变化,除了增加表以外,比如增加了IdentityResourceClaims表,然后也针对几个表,增删修改了几列字段,具体的我在下文会列举出来,自己更新的时候也可以看到,

所以我们就需要重新生成迁移报告和update数据库了,大家做好生产数据的备份和保护

如果你不更新数据库迁移的话,肯定会遇到这个错误的:

除了修改了数据库表结构,也同时配套了几个数据库脚本,方便我们使用,具体的查看官方源码即可,基本的更新内容这些:

迁移到ConfigurationDbContext的新模式需要做以下更改:


添加列:Clients、ApiResources、apiscope和ApiScopeClaims
移除列:ApiScopeClaims和ApiScope
重命名表:ApiClaims、ApiProperties、ApiSecrets、IdentityClaims和IdentityProperties
添加表:添加两个新表——ApiResourceScopes和ApiResourceProperties

有关新的范围和资源建模的更多细节,请参考IdentityServer4文档。

迁移到PersistedGrantDbContext的新模式需要做以下更改:
新列:为DeviceCodes和PersistedGrants添加列


为了使转换更容易,我们创建了几个脚本,涵盖四种不同的数据库类型:
MySQL
MsSQL
PostgreSQL
SQLite

可以看到这次升级,只是Ids4相关的组件库,并没有涉及到微软的Identity类库七个用户相关的表,所以用户数据不会丢失。也不用迁移用户数据。

PS:迁移的时候,如果是用我的项目,手动执行下那四个命令,不过相信每个玩过efcore的都明白如何操作:

1、PM> add-migration InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb 
2、PM> update-database -c PersistedGrantDbContext
3、PM> add-migration InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
4、PM> update-database -c ConfigurationDbContext// 因为不用迁移用户数据,所以不用管用户上下文

整个过程没有报错,虽然它提示说可能造成数据丢失,但是并没有

很流畅的就下来了,只是最后有一个小插曲,就是迁移好后,然后重新生成了容器镜像等,前端admin项目访问的时候,提示没有scope,后来发现Enabled为false了,不知什么时候被改了,修改为true就行了。

除了这个小插曲,文末的问题才是最重要的,但是也是很简单的,不要慌,往下看就是了。

02

控制器API方面

既然我们的数据库表结构都变了,那控制器的一些API和视频模型肯定也会有变化的,这是肯定的,具体我就不好列举了,涵盖以下几个部分:

AccountController、ConsentController、DeviceController、GrantsController、这四部分。

其实不要感觉更新的内容很多,都是很简单的几处,自己稍微看一看,或者用上边官方源代码覆盖下就好了。

03

视图部分

理所应当的,视图模型变了,那我们的页面也需要调整:

就是这么多,对应修改下就行了。

整个过程大概持续了30~60分钟,全程并没有很难受的地方,都是粘贴复制啥的。只要心静就可快速搞定。

更新完成以后,可以看到项目已经没有问题了,但是这个时候还会剩下一个小知识点,看startup.cs就知道了。

04

PART

配置源地址

如果你之前用过Ids4,肯定都知道那个梗,就是本地开发的时候一切正常,如果配置到服务器,源地址一直是localhost域名,之前我也写过一篇文章来讲如何处理这个问题,主要就是用到的是上边截图中,配置PublicOrigin这个属性即可,但是这次在4x版本中,这个api被删掉了。

如果你不做配置的话,会看到这个情况:

找了很多资料,最后还是在官方开源项目的Issue中发现了,看来还是得多看Issue,可能官方也发现3x升级4x有很多问题,干脆直接Pinned了一个issue:

最终的解决方案其实有两种,一种很简单,直接在中间件的最外层,也就是最上边,添加配置

 app.Use(async (ctx, next) =>{ctx.SetIdentityServerOrigin("https://xxx.com");await next();});

其实就是SetIdentityServerOrigin方法。

第二种就稍微复杂了些,需要三步:

配置服务:

services.Configure<ForwardedHeadersOptions>(options =>
{options.ForwardedHeaders =ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;options.KnownNetworks.Clear();options.KnownProxies.Clear();
});

配置中间件:

app.UseForwardedHeaders();

配置Nginx:

proxy_set_header X-Forwarded-Host $host:$proxy_port;

看自己的安排和喜好吧。

05

PART

校验Token

果然不出意外,报错了,是在Admin项目发起登录,获取token后,一直刷新,不能获取资源服务器的API,一直401,解析token查看,缺少字段:

大家可以看到,左侧迁移后的Token令牌竟然少了几个关键Claims,一定是哪里没有配置,

这里先大胆猜测下,我们能登录,证明用户系统没问题;

我们可以获取token,证明客户端Clients配置没问题;

但是一直401,缺少字段,那肯定是我们的资源服务确实对应的scope。

然后我各种检查,发现都是一样的数据,最后我想到了文章上边说到的官方除了增加几个字段以外,还增加了两个表,然后找了找资料,发现4x版本已经更新了,以前的时候,我们只需要针对客户端配置资源api就行了,比如这样:

但是如果你看一下刚刚新建的数据库,可以发现ApiScopes表已经没有了ApiResources表的外键了,所以需要在新增的表ApiResourceScopes中进行配置:


相当于做了一个跳板,当然你也可以说做了一个更复杂的关系表,因为这样的话,我们就可以针对一个资源服务器做多个Scope鉴权了,比如我们Blog.Core项目,我们可以分成好几个scope来鉴权,就像把一个资源服务器,拆成了多个一样,是不是又高级了!

到了这里,基本就已经迁移完成了,整个过程一个小时,当然你还需要部署什么的,也不难,我建议没有充裕的时间,还是用v3吧,如果自己不想折腾。

参考链接:

1、

https://github.com/IdentityServer/IdentityServer4/issues/4592

2、

https://www.identityserver.com/articles/migrating-your-identityserver4-v3-database-to-identityserver4-v4

3、

https://stackoverflow.com/questions/62713022/dotnet-core-identityserver4-reverse-proxy

4、

https://www.cnblogs.com/xhznl/p/13223964.html


彩蛋(2222):

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

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

相关文章

你真的清楚DateTime in C#吗?

DateTime&#xff0c;就是一个世界的大融合。日期和时间&#xff0c;在我们开发中非常重要。DateTime在C#中&#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结&#xff0c;包括DateTime对象的整体应用&#xff0c;以及如何处理不同的区域、时区、…

【翻译】.NET 5中的性能改进

在.NET Core之前的版本中&#xff0c;其实已经在博客中介绍了在该版本中发现的重大性能改进。 从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章&#xff0c;发现谈论越来越多的东西。然而有趣的是&#xff0c;每次都想知道下一次是否有足够的意义的改进以保证再发表…

[SpringSecurity]框架概述

概要 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方 案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”&a…

[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01

这是系列文章中的第一篇&#xff1a;使用GraphvizOnline可视化ASP.NETCore3.0终结点。.第1部分-使用DOT语言来可视化你的ASP.NETCore3.0终结点(本文)第2部分-向ASP.NET Core应用程序添加终节点图第3部分-使用ImpromptuInterface创建一个自定义的DfaGraphWriter&#xff0c;以便…

.NET Core CLI 的性能诊断工具介绍

前言开发人员的.NET Core项目上线后&#xff0c;经常会出现各种问题&#xff0c;内存泄漏&#xff0c;CPU 100%&#xff0c;处理时间长等&#xff0c; 这个时候就需要快速并准确的发现问题&#xff0c;并解决问题&#xff0c; 除了项目本身的日志记录外&#xff0c;NET Core 为…

[SpringSecurity]HelloWorld入门案例

入门案例 第一步 创建springboot工程 第二步 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springfram…

ASP.NET Core静态文件处理源码探究

前言静态文件&#xff08;如 HTML、CSS、图像和 JavaScript&#xff09;等是Web程序的重要组成部分。传统的ASP.NET项目一般都是部署在IIS上&#xff0c;IIS是一个功能非常强大的服务器平台&#xff0c;可以直接处理接收到的静态文件处理而不需要经过应用程序池处理&#xff0c…

[SpringSecurity]基本原理_过滤器链

SpringSecurity 本质是一个过滤器链&#xff1a; 从启动是可以获取到过滤器链&#xff1a; org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFil ter org.springframework.security.web.context.SecurityContextPersistenceFilter org.s…

通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

最近两天在Linux中调试.NET Core应用程序&#xff0c;同时我发现在Linux中调试.NET Core应用程序并不容易。一直习惯在Visual Studio中进行编码和调试。现在我想的是可以简单快速的测试.NET Core应用在Linux。所以通过本篇文章我们能了解到如何在Windows中使用Visual Studio进行…

[SpringSecurity]基本原理_过滤器加载过程

过滤器如何进行加载的&#xff1f; 1.使用SpringSecurity配置过滤器 DelegatingFilterProxy 其中上面的getTargetBeanName()得到的名字是FilterChainProxy 找到FilterChainProxy这个类中的doFilter方法 最后两张图片里面的代码表示&#xff1a; 用了一个增强for循环和getFi…

[SpringSecurity]基本原理_两个重要的接口_UserDetailsService接口和PasswordEncoder接口

UserDetailsService接口 当什么也没有配置的时候&#xff0c;账号和密码是由 Spring Security 定义生成的。而在实际项目中 账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。 如果需要自定义逻辑时&#xff0c;只需要实现 UserDetailsService 接…

.NET 开源项目 StreamJsonRpc 介绍[下篇]

阅读本文大概需要 9 分钟。大家好&#xff0c;这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇。上篇介绍了一些预备知识&#xff0c;包括 JSON-RPC 协议介绍&#xff0c;StreamJsonRpc 是一个实现了 JSON-RPC 协议的库&#xff0c;它基于 Stream、WebSocket 和自定义的全双工…

ASP.NET Core Blazor 初探之 Blazor Server

上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly)。这次来看看Blazor Server该怎么玩。Blazor ServerBlazor 技术又分两种&#xff1a;Blazor WebAssemblyBlazor ServerBlazor WebAssembly上次已经介绍过了&#xff0c;这次主要来…

[SpringSecurity]web权限方案_用户认证_设置用户名密码

设置登陆的用户名和密码 第一种方式&#xff1a;通过配置文件 spring.security.user.nameatguigu spring.security.user.passwordatguigu第二种方式&#xff1a;通过配置类 package com.atguigu.securitydemo1.config;import org.springframework.context.annotation.Bean; i…

[SpringSecurity]web权限方案_用户认证_查询数据库完成认证

#mysql 数据库连接 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/demo?serverTimezoneUTC spring.datasource.usernameroot spring.datasource.passwordrootpackage com.atguigu.securitydemo1.config;i…

.Net Core 2.2升级3.1的避坑指南

写在前面微软在更新.Net Core版本的时候&#xff0c;动作往往很大&#xff0c;使得每次更新版本的时候都得小心翼翼&#xff0c;坑实在是太多。往往是悄咪咪的移除了某项功能或者组件&#xff0c;或者不在支持XX方法&#xff0c;这就很花时间去找回需要的东西了&#xff0c;下面…

[SpringSecurity]web权限方案_用户认证_自定义用户登录页面

在配置类中实现相关的配置 Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() //自定义自己编写的登陆页面.loginPage("/login.html") //登陆页面设置.loginProcessingUrl("/user/login") //登陆访问路径.defa…

Asp.Net Core Blazor之容器部署

写在前面Docker作为开源的应用容器引擎&#xff0c;可以让我们很轻松的构建一个轻量级、易移植的容器&#xff0c;通过Docker方式进行持续交付、测试和部署&#xff0c;都是极为方便的&#xff0c;并且对于我们开发来说&#xff0c;最直观的优点还是解决了日常开发中的环境配置…

[SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole

基于角色或权限进行访问控制 hasAuthority 方法 如果当前的主体具有指定的权限&#xff0c;则返回 true,否则返回 false 在配置类设置当前访问地址有哪些 Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() //自定义自己编写的登…