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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Http Only Cookie保护AccessToken

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Http Only Cookie保护AccessToken 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【導讀】JWT認證方式目前已被廣泛使用,一直以來我們將token放在請求頭中的Authorization中,若通過此種方式,一旦token被惡意竊取,攻擊者可肆意對用戶可訪問資源進行任意索取

我們大多都是通過登錄成功后,響應AccessToken,然后由前端將token存儲在相關Storage中,然后每次將其放請求頭而認證請求,由于token是極其敏感信息,所以我們不能將其交由前端去處理,而應由后臺獲取對前端不可見

對安全有較高要求的平臺,我們通過Http Only Cookie來解決token惡意竊取問題

Http Only Cookie

Http Only Cookie簡言之則是將相關信息響應時存儲在Cookie中,而客戶端腳本無法訪問,每次請求時,則將自動攜帶所有信息到服務器。例如,京東存儲相關信息

接下來我們看看在.NET Core中如何將AccessToken以Http Only方式存儲在Cookie中

[AllowAnonymous] [HttpGet("api/test/get")] public?IActionResult?Get() {Response.Cookies.Append("x-access-token",?GenerateToken(),new?CookieOptions(){Path?=?"/",HttpOnly?=?true});return?Ok(); }

如上,我們模擬登錄成功,并不返回AccessToken,而是將其寫入到響應頭中,上述Cookie選項HttpOnly為true即表示客戶端腳本不可訪問

此時我們來訪問如下需認證接口

[HttpGet("api/test/say")] public?string?Say() {return?"Hello?World"; }

用過JWT的童鞋都知道,標準模式則是將AccessToken寫入到Authorization中,即請求頭【Authorization: Bearer ......】,那么上述是如何認證成功而請求到接口的呢?

當我們添加JWT認證時,每次請求在其對應事件OnMessageReceived中將自動獲取請求頭Authorization中的值,將其賦值給context.Token

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options?=> {......options.Events?=?new?JwtBearerEvents{OnMessageReceived?=?context?=>{//Bearer?Tokencontext.Token?=?"";??return?Task.CompletedTask;}}; });

你問我是怎么知道的,我是猜的嗎,當然不是,丟出官方源碼就知道了,直接找到JWT如何處理認證則一目了然

protected?override?async?Task<AuthenticateResult>?HandleAuthenticateAsync() {string?token?=?null;//?Give?application?opportunity?to?find?from?a?different?location,?adjust,?or?reject?tokenvar?messageReceivedContext?=?new?MessageReceivedContext(Context,?Scheme,?Options);//?event?can?set?the?tokenawait?Events.MessageReceived(messageReceivedContext);if?(messageReceivedContext.Result?!=?null){return?messageReceivedContext.Result;}//?If?application?retrieved?token?from?somewhere?else,?use?that.token?=?messageReceivedContext.Token;if?(string.IsNullOrEmpty(token)){string?authorization?=?Request.Headers[HeaderNames.Authorization];//?If?no?authorization?header?found,?nothing?to?process?furtherif?(string.IsNullOrEmpty(authorization)){return?AuthenticateResult.NoResult();}}.......? }

到這里我們知道了自動獲取Token的原理,我們修改了Token存儲方式,照葫蘆畫瓢就好,如此將覆蓋默認標準模式,如下:

OnMessageReceived?=?context?=> {var?accessToken?=?context.Request.Cookies["x-access-token"];if?(!string.IsNullOrEmpty(accessToken)){context.Token?=?accessToken;}return?Task.CompletedTask; }

從分析自動獲取Token原理,我們也可知道,若與第三方對接,依然可以使用請求頭Authorization標準模式認證,因為Cookie為空,再次獲取Authorization值

注意:發現若將前端未置于wwwroot下,即完全前后分離,涉及到跨域的情況下,比如使用的是axios封裝請求,那么應該必須在請求頭中添加【withCredentials:true 】,否則使用Http Only將無效,出現401

額外意外發現一個很有意思的問題,未深入研究,這里當做小知識了解下就好,或許是我自以為發現新大陸了呢

當我們創建AccessToken時,都會設置一個過期時間,我們知道此過期時間肯定不會設置過長,但是若在比如移動端微信小程序中,若設置時間不長,必然要考慮刷新Token問題,為了懶一點,我們將Token設置為永不過期,那么JWT支持嗎?

當然支持,只不過根據我剛好嘗試了幾次,找到了JWT永不過期的上限,最大只能是16年,若超過此臨界點,比如17年,如下:

將會出現401,具體錯誤如下:

了解,了解就好,也沒啥鳥用,我也是經常會瞎想,比如考慮某些可能存在的極限情況

總結

以上是生活随笔為你收集整理的Http Only Cookie保护AccessToken的全部內容,希望文章能夠幫你解決所遇到的問題。

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