IdentityServer 3.1.x 迁移到 4.x
一.前言
IdentityServer4 4.x已经正式发布了,根据官方的 Release Note,3.1.x 到 4.x 的变更也是非常多,今天在将代码迁移到 4.x 遇到了一些问题在此记录下来,我使用的 IdentityServer4 的各种数据持久化,比如 ClientStore,ResourceStore 等,都是完全自定义的,非 EntityFramework,如果你是使用的 EF 那么官方提供了迁移脚本,请自行查找。
二. Resource 相关变化
ApiResource 的 Scope 正式独立出来为 ApiScope 对象,开发者可能是想让用户明白 ApiResource 和 Scope 的关系,而不是把它们混为一谈,因为以前这一步都是 IdentityServer4 帮你做了,会自动以 ApiResource 的名称为 Scope,所以可能存在认为它们两个是相等的情况,实际则不然,Scope 是属于 ApiResource 的一个属性,可以包含多个 Scope。以源码来看:
1.ApiResource 的变化
3.1.x:

4.x:

2.InMemory 运行方式的变化
对于大家在学习 IdentityServer4 时熟悉的 InMemory 来说,AddInMemoryApiResources 变为了 AddInMemoryApiScopes 也就是变了名字,但一定要明白这里面实际的不同。
3.1.x:

4.x:

3.Resources 的变化
此类的构造方法变了,增加了 apiScopes 的参数,直接受影响的是 IResourceStore 的实现,如果自定义了此接口的实现,那么需要注意这个问题。
3.1.x:

4.x:

4.IResourceStore 的变化

三.PublicOrigin 属性被删除
IdentityServerOptions 对象中 PublicOrigin 属性没有了,此属性涉及到在生产环境经过nginx反向代理等设施后 configuration endpoint 获取到的地址的准确性,经过查询官方的 Issues,目前有两个解决方案:
1.在中间件中调用扩展方法
app.Use(async (ctx, next) =>
{
ctx.SetIdentityServerOrigin("https://foo.com");
await next();
});
or
app.Use(async (ctx, next) =>
{
ctx.Request.Scheme = "https";
ctx.Request.Host = new HostString("foo.com");
await next();
});
2.正确设置反向代理中的 X-Forwarded-For、X-Forwarded-Proto和X-Forwarded-Host,详细设置请查看:Configure ASP.NET Core to work with proxy servers and load balancers
相关资料:
关于此问题官方人员的原话:It's gone. It was a hack - please use the forwarded headers approach in ASP.NET Core from now on. 我个人更推荐第二个方法
四.IPersistedGrantStore 的变化
IPersistedGrantStore 接口的方法参数有变动:

五.总结
以上就是我在 IdentityServer4 3.1.x 到 4.x 迁移所遇到的各个问题,所有问题都解决了并且成功运行。我是重度自定义接口实现,包括表都是自行设计的,非EF,自定义实现的接口如下:IClientStore、IPersistedGrantStore、IProfileService、IResourceOwnerPasswordValidator、IResourceStore。3.1.x 到 4.x 确实许多 break changes,但从遇到的几个实际问题来说,开发人员在设计是已尽量兼容了老版本,希望我所遇到的问题,能帮到大家。官方开了一个 issues 记录迁移的问题,如果大家有难以解决的问题,不妨去提交:https://github.com/IdentityServer/IdentityServer4/issues/4592
IdentityServer 3.1.x 迁移到 4.x的更多相关文章
- .Net5 IdentityServer4下SqlServer和Mysql数据迁移
1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...
- IdentityServer(12)- 使用 ASP.NET Core Identity
IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...
- IdentityServer(14)- 使用EntityFramework Core配置和操作数据
IdentityServer具有良好的扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制. 本快速入门介绍了如何配置IdentityServer以使用EntityFramew ...
- .NET Core微服务之基于IdentityServer建立授权与验证服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功 ...
- IdentityServer(14)- 通过EntityFramework Core持久化配置和操作数据
本文用了EF,如果不适用EF的,请参考这篇文章,实现这些接口来自己定义存储等逻辑.http://www.cnblogs.com/stulzq/p/8144056.html IdentityServer ...
- 通过 NewLife.XCode 迁移任意现有数据库到任意数据库
通过 NewLife.XCode 迁移任意现有数据库到任意数据库(附分表分库方法) 本文背景是将其他系统的数据库迁移到另一个数据库(仅需 20 行代码),也可以作为项目迁移用,生成自己系统的专属实体代 ...
- ASP.NET Core会议管理平台实战_3、认证、授权表迁移
可以参考老张的这个文章: https://www.cnblogs.com/laozhang-is-phi/p/10660403.html 创建这个类库 看一下IdentityUser是在哪一个库下面. ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- IdentityServer4迁移至3.x版本注意问题详解
前言 之前有一位购买我课程的童鞋利用最新的IdentityServer4版本即对应.NET Core 3.x,发布到生产环境在学习,结果出了一些问题,此前我并未过多关注IdentityServer4升 ...
随机推荐
- Nginx 路由--Location的使用
一. 路由--Location的使用 9.1. Location语法规则 语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正 ...
- java 二维码生成(可带图片)springboot版
本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...
- 数据库漏洞扫描工具scuba
1.先下载安装scuba 参考地址 https://www.52pojie.cn/thread-702605-1-1.html 百度网盘下载地址: 链接:https://pan.baidu.com/ ...
- swift基本体验
Swift初体验 1. 导入框架 2. 定义标识符: let/var 3. 语句结束时;可以省略 4. print() 5. let/var 6. 逻辑分支 7. 循环使用 // 1.Swift中如何 ...
- Mysql查看最大连接,修改
1.查看最大连接量 show variables like '%max_connections%'; 2.修改最大连接量 //修改完记得重启 set GLOBAL max_connections = ...
- java安全编码指南之:堆污染Heap pollution
目录 简介 产生堆污染的例子 更通用的例子 可变参数 简介 什么是堆污染呢?堆污染是指当参数化类型变量引用的对象不是该参数化类型的对象时而发生的. 我们知道在JDK5中,引入了泛型的概念,我们可以在创 ...
- 解Bug之路-记一次对端机器宕机后的tcp行为
解Bug之路-记一次对端机器宕机后的tcp行为 前言 机器一般过质保之后,就会因为各种各样的问题而宕机.而这一次的宕机,让笔者观察到了平常观察不到的tcp在对端宕机情况下的行为.经过详细跟踪分析原因之 ...
- vue中axios的使用
新开了一个vue项目,从头到尾都是一个人做的,所以就自己配置了一个axios.js文件 第一种方法.使用axios 需要下载安装 npm install axios,下载完成之后 在main.js ...
- Win10使用VMWare15安装Ubuntu-18.04.2-desktop-amd64
本文在Win10系统中使用VMWare Workstation Pro 15.1.0虚拟机安装Ubuntu-18.04.2-desktop-amd64.iso系统,同时安装VMWare Tools(实 ...
- Unity 如何在窗口大小可以随意改变的情况下让游戏世界完整的显示在镜头中
当我们开发游戏时,如果是开发手机游戏,屏幕窗口的比例是固定的,不会说在运行时改变的. 但是,PC端的游戏就不一定,我希望它能被用户随意拉扯,但完整的内容还是能显示出来,这里我直接放例子: 请注意黑色的 ...