溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IdentityServer4遷移至3.x版本的注意問題有哪些

發(fā)布時(shí)間:2021-11-23 18:13:12 來源:億速云 閱讀:140 作者:柒染 欄目:大數(shù)據(jù)

IdentityServer4遷移至3.x版本的注意問題有哪些,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

遷移升級(jí)基礎(chǔ)問題

對(duì)于Identity里面的上下文【IdentityDbContext】需要額外下載如下包:

【Microsoft.AspNetCore.Identity.EntityFrameworkCore】

針對(duì)如下客戶端OIDC的配置,需要下載如下包

【Microsoft.AspNetCore.Authentication.OpenIdConnect】

IdentityServer4遷移至3.x版本的注意問題有哪些

針對(duì)客戶端認(rèn)證和授權(quán)配置,需要如下配置授權(quán)中間件(認(rèn)證和授權(quán)無先后順序)

IdentityServer4遷移至3.x版本的注意問題有哪些

我們知道在此之前對(duì)于遷移命名是包含在dotnet CLI里面,現(xiàn)已修改為通過單獨(dú)的包來進(jìn)行,所以我們需要下載如下提示包,否則將拋出如下異常

IdentityServer4遷移至3.x版本的注意問題有哪些

還有可能遇到命令行工具版本和當(dāng)前.NET Core版本不一致的問題,通過如下命令進(jìn)行更新

IdentityServer4遷移至3.x版本的注意問題有哪些

在本地環(huán)境可能么有任何問題,但是到了生產(chǎn)環(huán)境,可能會(huì)拋出如下錯(cuò)誤,我們是不是會(huì)一臉懵逼呢。

IdentityServer4遷移至3.x版本的注意問題有哪些

針對(duì)上述異常的拋出,接下來通過漫長一段話來講解關(guān)于Cookie的故事

 

Cookie安全策略問題

大約在20年前設(shè)計(jì)cookie時(shí)以及之后重新設(shè)計(jì)該cookie時(shí),跨站點(diǎn)請(qǐng)求偽造(CSRF)攻擊和跟蹤用戶都不是什么大事,  在cookie規(guī)范中說,如果為特定域設(shè)置了cookie,則瀏覽器發(fā)出的每個(gè)請(qǐng)求都會(huì)將其發(fā)送到該域,無論我們是否直接導(dǎo)航到該域,如果瀏覽器只是從該域加載資源(即圖像),向其發(fā)送POST請(qǐng)求或?qū)⑵湟徊糠智度氲絠frame中,  但是還有一種情況,我們并不希望瀏覽器自動(dòng)將用戶會(huì)話cookie發(fā)送到服務(wù)器,因?yàn)檫@將允許任何網(wǎng)站會(huì)執(zhí)行腳本,該腳本在該用戶的上下文中對(duì)服務(wù)器執(zhí)行請(qǐng)求,  為避免這種情況,于2016年起草了SameSite cookie規(guī)范,它使我們可以更好地控制何時(shí)應(yīng)發(fā)送和不應(yīng)該發(fā)送cookie,設(shè)置cookie時(shí),我們現(xiàn)在可以在瀏覽器將其添加到其中時(shí)為每個(gè)cookie明確指定,為此,它引入了當(dāng)瀏覽器位于我們自己的域上時(shí)相同站點(diǎn)cookie的概念,以及當(dāng)瀏覽器導(dǎo)航到另一個(gè)域但將請(qǐng)求發(fā)送到我們的域時(shí)跨站點(diǎn)cookie的概念,  為了向后兼容,相同站點(diǎn)cookie的默認(rèn)設(shè)置并不會(huì)更改以前的行為,若我們加入該新功能,需要將cookie顯式設(shè)置為SameSite = Lax或SameSite = Strict,以使其更加安全,這已在.NET Framework和所有常見的瀏覽器中實(shí)現(xiàn),Lax表示將在初始導(dǎo)航時(shí)將cookie發(fā)送到服務(wù)器,Strict表示僅在我們已經(jīng)在該域中時(shí)(即在初始導(dǎo)航之后發(fā)送第二個(gè)請(qǐng)求)才發(fā)送cookie。  但是呢,這項(xiàng)新功能卻并沒有被廣泛采用(基于2019年3月Chrome的遙測(cè)數(shù)據(jù),Chrome在全球范圍內(nèi)處理的所有cookie中,只有0.1%使用了SameSite標(biāo)志,Google為了實(shí)現(xiàn)推動(dòng)該新功能的目標(biāo),他們決定更改世界上最常用的瀏覽器的默認(rèn)設(shè)置:  Chrome 80將需要新指定的設(shè)置SameSite = None來保持處理Cookie的舊方法,并且如果我們像建議的舊規(guī)范那樣省略SameSite字段的話,它將cookie與SameSite = Lax一起設(shè)置。  請(qǐng)注意:  僅當(dāng)cookie也被標(biāo)記為Secure并且需要HTTPS連接時(shí),設(shè)置SameSite = None才有效,  這里關(guān)于更多SameSite的信息就不再闡述。  如果我們有一個(gè)單頁Web應(yīng)用程序(SPA),該Web應(yīng)用程序通過另一個(gè)域上托管的身份提供程序(例如IdentityServer 4中的Idp)進(jìn)行身份驗(yàn)證,并且該應(yīng)用程序使用所謂的令牌刷新,則將會(huì)受到影響,登錄IdP時(shí),它將為我們的用戶設(shè)置一個(gè)會(huì)話cookie,并且該cookie來自IdP域,  在身份驗(yàn)證流程結(jié)束時(shí),來自不同域的應(yīng)用程序?qū)⑹盏侥撤N訪問令牌,這些令牌通常生命周期并不長,當(dāng)該令牌過期時(shí),應(yīng)用程序?qū)o法再訪問資源服務(wù)器(API),如果用戶每次都必須再次登錄,可想用戶體驗(yàn)之差,  為防止這種情況,我們可以使用刷新令牌,在這種情況下,應(yīng)用程序?qū)?chuàng)建一個(gè)用戶不可見的iframe,然后在該iframe中再次啟動(dòng)身份驗(yàn)證過程, IdP的網(wǎng)站已加載到iframe中,并且如果瀏覽器通過IdP發(fā)送會(huì)話cookie,則會(huì)識(shí)別用戶并發(fā)出新令牌,現(xiàn)在,iframe位于應(yīng)用程序域中托管的SPA中,其內(nèi)容來自IdP域,這將被視為跨站點(diǎn)請(qǐng)求,  因此,如果Cookie明確指出SameSite = None,則Chrome 80只會(huì)將該Cookie從iframe發(fā)送到IdP,否則,令牌刷新將在Chrome 80中出現(xiàn)中斷的情況。  也還有其他可能潛在的問題,如果我們?cè)赪eb應(yīng)用程序或網(wǎng)站中嵌入了來自另一個(gè)域的元素(例如視頻),并且這些元素需要Cookie才能正常運(yùn)行(例如自動(dòng)播放設(shè)置),那么這些也會(huì)需要設(shè)置SameSite策略,如果我們的應(yīng)用程序需要從瀏覽器請(qǐng)求依賴Cookie身份驗(yàn)證的第三方API,則同樣適用,我們只能更改自己服務(wù)器從而設(shè)置cookie行為。
 
講解了這么多貌似好像沒有用的廢話,實(shí)際上就是出現(xiàn)了跨站點(diǎn)安全策略即SameSite的設(shè)定,如上異常的拋出,追本溯源在于是什么原因?qū)е铝丝蛻舳说腃ookie丟失?  通過上述對(duì)Cookie的講解,我們可以顯式設(shè)置SameSite安全策略從而保證到底發(fā)不發(fā)送Cookie,所以我猜測(cè)在.NET Core 3.x中是不是更改了Cookie的安全策略,如果客戶端的為Strict的話,那就會(huì)導(dǎo)致上述異常的發(fā)生,比如如下:
IdentityServer4遷移至3.x版本的注意問題有哪些

說到這里,為了驗(yàn)證我的結(jié)論,我立馬翻看了關(guān)于.NET Core中Cookie對(duì)于安全策略的設(shè)置,難道真的將Strict作為默認(rèn)的安全策略嗎?
IdentityServer4遷移至3.x版本的注意問題有哪些
原來該安全策略的默認(rèn)選項(xiàng)就是Lax(寬松策略),然后繼續(xù)來到上述的issue,在2.0中就解決了此問題將Strict修改為了Lax,就是為了解決OAuth中重定向跳轉(zhuǎn)認(rèn)證的問題。

這個(gè)結(jié)果雖在意料之中,但是也在意料之外,那位童鞋也遇到了拋出上述異常的問題,我就是顯式設(shè)置上述安全策略為Lax得到了解決,讓我很是納悶,這是何故,我也不知道,但是確確實(shí)實(shí)是解決了,最終客戶端也正常跑起來了。

最后也同樣重要的是:IdentityServer4在生產(chǎn)環(huán)境中是啟用了HTTPS,所以在發(fā)布到生產(chǎn)環(huán)境后若未使用HTTPS,一定要將啟用HTTPS選項(xiàng)顯式配置為false,而本地則不然,遇到問題首先分析問題,然后看官方文檔,如若還不能解決,只能通過經(jīng)驗(yàn)來進(jìn)行可能原因分析了。
我只是將IdentityServer4升級(jí)到.NET Core 3.x的版本需要注意的問題做了一個(gè)粗略的解答,根據(jù)我的經(jīng)驗(yàn),一部分原因出在對(duì)于官方文檔概念未詳細(xì)解導(dǎo)致,另外一部分原因出在由于版本升級(jí)導(dǎo)致內(nèi)置處理出現(xiàn)了更改,但官方文檔并未更新,這個(gè)最麻煩,出現(xiàn)這樣的問題只能硬啃源代碼并調(diào)試,我也同時(shí)將我原先在長沙社區(qū)成立時(shí)所演講的IDS4 Demo(已發(fā)布到我的github)已更新到了最新.NET Core 3.1.2版本。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI