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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

發布時間:2023/12/4 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core Web Api之JWT VS Session VS Cookie(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文我們來探討下JWT VS Session的問題,我們可直接拋出問題:使用客戶端存儲的JWT比服務端維持Session更好嗎??


既然要比較JWT VS Session,那我們就得知道為何需要JWT和Session,它們共同是為了解決什么問題呢?那我們從一個場景說起,網上購物現已是再平常不過的事情了,當我們將某個商品加入購物車后,然后跳轉到其他商品頁面此時需要之前選擇的商品依然在購物車中,此時就需要維持會話,因為HTTP無狀態,所以JWT和Session共同點都是為了持久維持會話而存在,為了克服HTTP無狀態的情況,JWT和Session分別是如何處理的呢?


JWT VS Session

Session:當用戶在應用系統中登錄后,此時服務端會創建一個Session(我們也稱作為會話),然后SessionId會保存到用戶的Cookie中,只要用戶是登錄狀態,對于每個請求,在Cookie中的SessionId都會發送到服務端,然后服務端會將保存在內存中的SessionId和Cookie中的SessionId進行比較來認證用戶的身份并響應。


JWT:當用戶在應用系統中登錄后,此時服務端會創建一個JWT,并將JWT發送到客戶端,客戶端存儲JWT(一般是在Local Storage中)同時在每個請求頭即Authorization中包含JWT,對于每個請求,服務端都會進行驗證JWT是否合法,直接在服務端本地進行驗證,比如頒發者,受理者等等,以致于無需發出網絡請求或與數據庫交互,這種方式可能比使用Session更快,從而加快響應性能,降低服務器和數據庫服務器負載。


通過如上對JWT認證和Session認證簡短的描述,我們知道二者最大的不同在于Session是存儲在服務端,而JWT存儲在客戶端。服務端存儲會話無外乎兩種,一種是將會話標識符存儲在數據庫,一種是存儲在內存中維持會話,我想大多數情況下都是基于內存來維持會話,但是這會帶來一定的問題,如果系統存在大流量,也就是說若有大量用戶訪問系統,此時使用基于內存維持的會話則限制了水平擴展,但對基于Token的認證則不存在這樣的問題,同時Cookie一般也只適用于單域或子域,如果對于跨域,假如是第三方Cookie,瀏覽器可能會禁用Cookie,所以也受瀏覽器限制,但對Token認證來說不是問題,因為其保存在請求頭中。


如果我們將會話轉移到客戶端,也就是說使用Token認證,此時將解除會話對服務端的依賴,同時也可水平擴展,不受瀏覽器限制,但是與此同時也會帶來一定的問題,一是令牌的傳輸安全性,對于令牌傳輸安全性我們可使用HTTPS加密通道來解決,二是與存儲在Cookie中的SessionId相比,JWT顯然要大很多,因為JWT中還包含用戶信息,所以為了解決這個問題,我們盡量確保JWT中只包含必要的信息(大多數情況下只包含sub以及其他重要信息),對于敏感信息我們也應該省略掉從而防止XSS攻擊。JWT的核心在于聲明,聲明在JWT中是JSON數據,也就是說我們可以在JWT中嵌入用戶信息,從而減少數據庫負載。所以綜上所述JWT解決了其他會話存在的問題或缺點:

更靈活、更安全、減少數據庫往返,從而實現水平可伸縮、防篡改客戶端聲明、移動設備上能更好工作、適用于阻止Cookie的用戶

綜上關于JWT在有效期內沒有強制使其無效的能力而完全否定JWT的好處顯然站不住腳,當然不可辯駁的是若是沒有如上諸多使用限制,實現其他類型的身份驗證完全也是合情合理且合法的,需綜合權衡,而非一家之言下死結論。到目前為止,我們一直討論的是JWT VS Session認證,而不是JWT VS Cookie認證,但是如標題我們將Cookie也納入了,只是想讓學習者別搞混了,因為JWT VS Cookie認證這種說法是錯誤的,Cookie只是一種存儲和傳輸信息介質,只能說我們可以通過Cookie存儲和傳輸JWT。接下來我們來實現Cookie存儲和傳輸JWT令牌。

JWT AS Cookies Identity Claim

在Startup中我們可以添加如下Cookie認證中間件,此時我們有必要了解下配置Cookie的一些選項,通過對這些選項的配置來告知Cookie身份認證中間件在瀏覽器中的表現形式,我們看下幾個涉及到安全的選項。

配置HttpOnly標志著Cookie是否僅供服務端使用,而不能通過前端直接訪問。


配置SecurePolicy將限制Cookie為HTTPS,在生產環境建議配置此參數同時支持HTTPS。


配置SameSite用來指示瀏覽器是否可以將Cookie與跨站點請求一同使用,若是對于OAuth身份認證,可設置為Lax,允許外部鏈接重定向發出比如POST請求而維持會話,若是Cookie認證,設置為Restrict,因為Cookie認證只適用于單站點,若是設置為None,則不會設置Cookie Header值。(注意:SameSite屬性在谷歌、火狐瀏覽器均已實現,對于IE11好像不支持,Safari從版本12.1開始支持該屬性)


在創建.NET Core默認Web應用程序時,在ConfigureServices方法中,通過中間件直接配置了全局Cookie策略,如下:

當然默認配置了全局Cookie策略,同時也在Configure方法中使用其策略如下:

我們也可以直接在上述調用使用Cookie策略中間件的方法中來設置對應參數策略,如下:

若是我們在添加Cookie中間件的同時也配置全局Cookie策略,我們會發現對于屬性HTTPOnly和SameSite都可配置,此時個人猜測會存在覆蓋的情況,如下:

對于需要認證的控制器我們需要添加上[Authroize]特性,對每一個控制器我們都得添加這樣一個特性,相信大部分童鞋都是這么干的。其實我們大可反向操作,對于無需認證的我們添加可匿名訪問特性即可,而需要認證的控制器我們進行全局配置認證過濾器,如下:


好了到了這里,我們只是粗略的講解了下關于Cookie中間件參數配置和Cookie全局配置策略的說明,沒有太深入去研究里面的細枝末節,等遇到問題再具體分析吧。繼續回到話題,Cookie認證相比JWT對API訪問來講安全系數低,所以我們完全可以在Cookie認證中結合JWT來使用。具體我們可嘗試怎么搞呢?將其放到身份信息聲明中,我想應該是可行的方式,我們來模擬登陸和登出試試,大概代碼如下:

上述代碼很簡單,無需我再多講,和Cookie認證無異,只是我們在聲明中添加了access_token來提高安全性,接下來我們自定義一個Action過濾器特性,并將此特性應用于Action方法,如下:

JWT Combine Cookie Authentication

如上是采用將JWT放到聲明的做法,我想這么做也未嘗不可,至少我沒找到這么做有什么不妥當的地方。我們也可以將Cookie認證和JWT認證進行混合使用,只不過是在上一節的基礎上添加了Cookie中間件罷了,如下圖:

通過如上配置后我們就可以將Cookie和JWT認證來組合使用了,比如我們在用戶登錄后,如下圖點擊登錄后顯示當前登錄用戶名,然后點擊退出,在退出Action方法上我們添加組合特性:


在上一節中,我們通過獲取AccessToken,從而訪問端口號為5001的客戶端來獲取當前時間,那現在我們針對獲取當前時間的方法添加上需要Cookie認證,如下:


Cookie認證撤銷

在.NET Core 2.1版本通過Cookie進行認證中,當用戶與應用程序進行交互修改了信息,需要在cookie的整個生命周期,也就說在注銷或cookie過期之前看不到信息的更改時,我們可通過cookie的身份認證事件【撤銷身份】來實現這樣的需求,下面我們來看看。

我們通過重寫CookieAuthenticationEvents事件中的ValidatePrincipal,然后判斷寫在內存中關于用戶表示是否存在,若存在則調用 context.RejectPrincipal() 撤銷用戶身份。然后我們在添加Cookie中間件里配置該事件類型以及對其進行注冊:

接下來我們寫一個在頁面上點擊【修改信息】的方法,并在內存中設置撤銷指定用戶,如下:

從如上動圖中我們可以看到,當點擊修改信息后,然后將撤銷的用戶標識寫入到內存中,然后跳轉到Index頁面,此時調用我們寫的撤銷事件,最終重定向到登錄頁,且此時用戶cookie仍未過期,所以我們能夠在左上角看到用戶名,不清楚這種場景在什么情況下才會用到。


跳轉至登錄攜帶或移除參數

當我們在某個頁面進行操作時,若此時Token或Cookie過期了,此時則會自動引導用戶且將用戶當前訪問的URL攜帶并重定向跳轉到登錄頁進行登錄,比如關于博客園如下跳轉URL:

但是如果我們有這樣的業務場景:用于跳轉至登錄頁時,在URL上需要攜帶額外的參數,我們需要獲取此業務參數才能進行對應業務處理,那么此時我們應該如何做呢?我們依然是重寫CookieAuthenticationEvents事件中的RedrectToLogin方法,如下:

這里需要注意的是因為上述我們用到了IActionContextAccessor,所以我們需要將其進行對應如下注冊:

最終我們跳轉到登錄頁將會看到我們添加的額外參數id也將呈現在url上,如下:

本節我們講解了Session和JWT的優缺點以及Cookie認證中可能我們需要用到的地方,下一節也是JWT最后一節內容,我們講講并探討如何實現刷新Token,感謝閱讀

總結

以上是生活随笔為你收集整理的ASP.NET Core Web Api之JWT VS Session VS Cookie(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。