日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Ids4实战】最全的 v4 版本升级指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(恰似一江春水向東流)

最近聽說IdentityServer4從v3升級到v4了,其實很簡單,就是nuget包升級一下的事兒,不過沒想到涉及到的內(nèi)容還挺多,要不然也不會直接從3.1直接蹦到4.0,這么大的跨度,證明已經(jīng)涉及到核心的類做了修改。

不要抱怨一直修改,畢竟已經(jīng)很多人寫了更新文檔了,軟件系統(tǒng)就是一直更新的過程。當然,如果不更新使用v3也可以,功能幾乎都是一樣的,但是我更喜歡更新到最新版本。相關代碼已經(jīng)放到了項目的4x分支(如果沒有,說明已經(jīng)上線,并遷到主分支了):

已經(jīng)通過docker部署好了,現(xiàn)在大家看到的online效果,就是4x版本的。那下邊就快速說說更新過程吧,放心,前方安全,并沒有涉及到什么看不懂的原理。

最終更新的文件這么多:

01

PART

升級依賴包

升級肯定要從nuget包開始,以下這幾個就是我認證中心項目使用的nuget包,一鍵升級全部,可以看到都是最新的了:

(升級nuget包)

操作確實是很簡單,操作也在預料之中,只不過沒想到會這么多(其實更多,因為這里僅僅是編譯下的Errors,有些頁面內(nèi)的還沒有被編譯到):

那下邊就開始動手遷移吧,再問一下自己,是否準備好了,3x版其實也可以。

02

PART

尋找模板

以下的是我的摸索歷程,畢竟我看的代碼和文章基本都是3x的。

01

更新官方模板

上邊我們僅僅是更新了Ids4的核心庫,我想象著官方既然更新了核心庫,那他們的模板庫已經(jīng)也已經(jīng)更新了,然后就卸載了這幾個模板,又重新安裝了一次:

相關的安裝命令是這樣的:

// 安裝模板 dotnet?new?-i?IdentityServer4.Templates // 初始化項目 dotnet new is4admin --name Idp

因為我用的是快速啟動項目,所以就直接生成了一個is4admin的項目,發(fā)現(xiàn),事情并沒有我想象的那么簡單,他們基本還是3x版本的。

其實有一個是4x版本的,就是is4inmem版本的:

dotnet new is4inmem --name Idp

他這個是4x版本的,只不過是內(nèi)存模式的,有很多地方還是和我們的不一樣,沒辦法,只能尋找官網(wǎng)了。

02

查看源碼

其實官方的源碼很多也都還是3x版本的,畢竟模板都是這樣,直接用文件查找的方式,一一的點開來看,最終還是找到了:

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

當然官網(wǎng)有很多地方,最終我是在host文件夾下,才發(fā)現(xiàn)了4x版本的快速啟動代碼,然后開始針對錯誤一一的處理,主要的修改的地方有以下幾個部分。

03

PART

主要修復部分

01

DB上下文部分

其實大家根據(jù)上邊的報錯一一修改就行了,我這里簡單的列舉下,心里有個譜。

本次升級到4x,數(shù)據(jù)庫發(fā)生了變化,除了增加表以外,比如增加了IdentityResourceClaims表,然后也針對幾個表,增刪修改了幾列字段,具體的我在下文會列舉出來,自己更新的時候也可以看到,

所以我們就需要重新生成遷移報告和update數(shù)據(jù)庫了,大家做好生產(chǎn)數(shù)據(jù)的備份和保護

如果你不更新數(shù)據(jù)庫遷移的話,肯定會遇到這個錯誤的:

除了修改了數(shù)據(jù)庫表結構,也同時配套了幾個數(shù)據(jù)庫腳本,方便我們使用,具體的查看官方源碼即可,基本的更新內(nèi)容這些:

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


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

有關新的范圍和資源建模的更多細節(jié),請參考IdentityServer4文檔。

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


為了使轉(zhuǎn)換更容易,我們創(chuàng)建了幾個腳本,涵蓋四種不同的數(shù)據(jù)庫類型:
MySQL
MsSQL
PostgreSQL
SQLite

可以看到這次升級,只是Ids4相關的組件庫,并沒有涉及到微軟的Identity類庫七個用戶相關的表,所以用戶數(shù)據(jù)不會丟失。也不用遷移用戶數(shù)據(jù)。

PS:遷移的時候,如果是用我的項目,手動執(zhí)行下那四個命令,不過相信每個玩過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//?因為不用遷移用戶數(shù)據(jù),所以不用管用戶上下文

整個過程沒有報錯,雖然它提示說可能造成數(shù)據(jù)丟失,但是并沒有

很流暢的就下來了,只是最后有一個小插曲,就是遷移好后,然后重新生成了容器鏡像等,前端admin項目訪問的時候,提示沒有scope,后來發(fā)現(xiàn)Enabled為false了,不知什么時候被改了,修改為true就行了。

除了這個小插曲,文末的問題才是最重要的,但是也是很簡單的,不要慌,往下看就是了。

02

控制器API方面

既然我們的數(shù)據(jù)庫表結構都變了,那控制器的一些API和視頻模型肯定也會有變化的,這是肯定的,具體我就不好列舉了,涵蓋以下幾個部分:

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

其實不要感覺更新的內(nèi)容很多,都是很簡單的幾處,自己稍微看一看,或者用上邊官方源代碼覆蓋下就好了。

03

視圖部分

理所應當?shù)?#xff0c;視圖模型變了,那我們的頁面也需要調(diào)整:

就是這么多,對應修改下就行了。

整個過程大概持續(xù)了30~60分鐘,全程并沒有很難受的地方,都是粘貼復制啥的。只要心靜就可快速搞定。

更新完成以后,可以看到項目已經(jīng)沒有問題了,但是這個時候還會剩下一個小知識點,看startup.cs就知道了。

04

PART

配置源地址

如果你之前用過Ids4,肯定都知道那個梗,就是本地開發(fā)的時候一切正常,如果配置到服務器,源地址一直是localhost域名,之前我也寫過一篇文章來講如何處理這個問題,主要就是用到的是上邊截圖中,配置PublicOrigin這個屬性即可,但是這次在4x版本中,這個api被刪掉了。

如果你不做配置的話,會看到這個情況:

找了很多資料,最后還是在官方開源項目的Issue中發(fā)現(xiàn)了,看來還是得多看Issue,可能官方也發(fā)現(xiàn)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項目發(fā)起登錄,獲取token后,一直刷新,不能獲取資源服務器的API,一直401,解析token查看,缺少字段:

大家可以看到,左側(cè)遷移后的Token令牌竟然少了幾個關鍵Claims,一定是哪里沒有配置,

這里先大膽猜測下,我們能登錄,證明用戶系統(tǒng)沒問題;

我們可以獲取token,證明客戶端Clients配置沒問題;

但是一直401,缺少字段,那肯定是我們的資源服務確實對應的scope。

然后我各種檢查,發(fā)現(xiàn)都是一樣的數(shù)據(jù),最后我想到了文章上邊說到的官方除了增加幾個字段以外,還增加了兩個表,然后找了找資料,發(fā)現(xiàn)4x版本已經(jīng)更新了,以前的時候,我們只需要針對客戶端配置資源api就行了,比如這樣:

但是如果你看一下剛剛新建的數(shù)據(jù)庫,可以發(fā)現(xiàn)ApiScopes表已經(jīng)沒有了ApiResources表的外鍵了,所以需要在新增的表ApiResourceScopes中進行配置:


相當于做了一個跳板,當然你也可以說做了一個更復雜的關系表,因為這樣的話,我們就可以針對一個資源服務器做多個Scope鑒權了,比如我們Blog.Core項目,我們可以分成好幾個scope來鑒權,就像把一個資源服務器,拆成了多個一樣,是不是又高級了!

到了這里,基本就已經(jīng)遷移完成了,整個過程一個小時,當然你還需要部署什么的,也不難,我建議沒有充裕的時間,還是用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):

總結

以上是生活随笔為你收集整理的【Ids4实战】最全的 v4 版本升级指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。