簡體   English   中英

ASP.NET 核心。 更改密碼后如何使 JWT-Token 失效

[英]ASP.NET Core. How can I invalidate JWT-Token after password change

對不起,我的英語不好。 我正在使用 Vue.JS 為客戶端在 ASP.NET Core 中編寫應用程序。 對於身份驗證用戶,我使用 JWT 和 ASP.NET Identity。 我有一個更改密碼的方法。 但我不明白:如何在密碼更改后使令牌無效? 我希望在另一個瀏覽器中通過身份驗證的用戶將在此之后注銷。 有遇到這種問題的人嗎?

您通常不會使JWT無效,因為它們是短期訪問令牌,因此在更改密碼后,請求新令牌將提示用戶重新輸入憑據。

如果您確實需要在更改密碼后立即使JWT無效 - 您需要查看Introspection ,您的后端api實際上有一個反向通道到您的令牌發行者,然后它可以重新驗證每個請求的令牌。 這樣,如果您在發行方一方使令牌無效 - 它將立即反映在API方面。

我一直在考慮這個問題,無法使已經存在的 JWT 無效可能不會被內置到任何東西中,但這是可能的。

敘述如下:您安裝了一個可以通過網絡控制的警報系統,並且您的前 S/O 已登錄到您之前共享的帳戶。 他們心煩意亂,總是在隨機時間啟用警報。 如果 Web 應用程序使用 JWT 來存儲會話,您可以更改密碼,但您前任擁有的 JWT 仍然可以使用一段時間,直到超時。

  • 解決方案1:短超時。 但是如果您想長時間保持登錄狀態(例如密碼管理器)怎么辦
  • 解決方案 2:通過更改認證機構的簽名密鑰注銷所有用戶,基本上使所有 JWT 全面​​失效。 這仍然是一條不太理想的路線,我相信您可以想象。
  • 解決方案 3:跟蹤用戶表中每個用戶的當前 JWT。 如果他們擁有的 JWT 與當前的 JWT 不同,那么他們就不會被認證。 如果用戶注銷,請取消用戶表中存儲的 JWT 數據,這同樣會對該用戶的 JWT 進行身份驗證並強制重新登錄。 我還建議為用戶存儲一個“登錄”的布爾值。 不要依賴於此。 這將是一個在他們登錄時設置為 true 的值,當他們注銷時將其設置為 false,並在他們向您傳遞 JWT 時驗證該值是否為“true”。 這將確保他們在注銷時被迫重新進行身份驗證。

假設您使用解決方案 3:

在為這個解決方案存儲 JWT 數據時,我傾向於不存儲整個 JWT,因為它開始時是相當大的文本。 或者,只需存儲 JWS(JWT 簽名),如果因任何原因被捕獲,這將使存儲的值更小且不可用。 接下來,它是一個哈希值,所以我們可以只存儲最后的 9 個值(9 個,因為 int32 最大值是 2147483647)。 我們只需要一點獨特性,並不多。 接下來,如果我們使用正則表達式從 JWS 中提取整數並再次取您遇到的前 9 個數字,我們可以避免字符串比較以驗證傳遞的 JWS 是活動的。

按照這種方法,回到敘述,如果您要注銷,您的用戶將被標記為已注銷,導致您和您的 S/O 都需要重新進行身份驗證。 (假設您已經更改了密碼,那么您就是黃金,否則是時候聯系客戶支持了)如果您要重新登錄,您將獲得一個新的 JWT,並且一個新的簽名將存儲在用戶表中。 如果您的 S/O 嘗試使用該站點,他們將無法通過舊的 JWT 進行身份驗證,並會被迫重新登錄。

權衡:如果我們只存儲 JWS,或者按照我的建議存儲其中的一部分,則多個用戶無法同時登錄同一個帳戶。 您對此的感受實際上取決於您的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM