iT邦幫忙

0

net core使用JWT後 使用者權限 問題

deh 2020-12-08 16:09:522110 瀏覽

各位前輩好
目前將JWT的bearer token存在cookie的httpOnly內實現登入,清除token實現登出。
不過使用者除了登入登出之外,還有Menu使用權限的資訊,權限可由API取得,如下圖:
https://ithelp.ithome.com.tw/upload/images/20201208/20121952iOSZUmLc7b.jpg

但每次要驗證權限時都Call API,若使用者多的時候API端會有壓力,
都存在Cookie因為大小限制估計也不行,
故想到下面其他方法,隔一段時間才call API更新,其他時候用暫存的:
1.存在Singleton的Service中(也就是Server的ram裡面,像Dictionary,在cookie內存一個key就好)。
2.像以前一樣存在DB裡面,同樣cookie內存一個key。

那樣做會比較好呢?或是有其他做法?

*環境為.net core 2.1

通靈亡 iT邦高手 1 級 ‧ 2020-12-08 17:30:28 檢舉
3. Server端 => JWT 存在Redis,Client端 => JWT 存在 Httponly 的 Cookies
deh iT邦研究生 1 級 ‧ 2020-12-09 08:25:49 檢舉
來去了解一下Redis,感謝回覆
deh iT邦研究生 1 級 ‧ 2020-12-09 08:46:33 檢舉
了解了一下Redis,算是我原本想的1與2的改良方法,既避免了1.拿Dictionary當DB會發生的問題,也避免了2.不斷連DB的問題!真好!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-12-08 18:50:02
最佳解答

我這邊的作法是直接回傳menu的路由給前端使用。
所以權限是在登入的時候就一起生成傳回給前端儲存。
當然了,因為cookie的容量問題。我並不是儲存在cookie上。

畢竟我是採用vue的應用。基本上來說變數並不會消失。也沒有換頁方面的問題存在。
真的重整頁面了,就再請求一次就好。

至於請求安全性的問題。畢竟我是採用 Middleware 的做法。在token存在的同時,本身也會緩存對應的權限資料。並不會特別再去請求db處理。

如果突然有在後台重新調整權限之類的動作。早前的做法是會全部對應的人重置緩存。
但隨著後期的人數變多。
後來就採用將人員登出處理。(並不是全部,而是有對應的群組才做處理)
他們重新登入。其實前端重整也會拿到新的設定權限。
但丟出重整的命令總是不好。

現在正在研究新的做法,要搭配 winsock 來處理。還沒研究完全。

deh iT邦研究生 1 級 ‧ 2020-12-09 08:33:25 檢舉

感謝回覆,重新調整權限確實是個問題,目前都綁token直到刷新token。之後有需要的話也要找找其他方案

1
JB
iT邦新手 4 級 ‧ 2020-12-11 09:37:22
  1. 使用者的Menu權限應該在登入後從DB取得後,同時寫一份到快取(可用MemoryCache or Redis),如果該使用者的權限被更動,再清除快取並重複前述的動作。 另外也可以考慮簡化儲存Menu權限的方式到Cookie,例如 101000 表示使用者擁有第一個主功能底下的第二個子功能的權限。 當然也要對JWT的的claim作檢查。
  2. 如果同時登入的peak requests太高,可考慮在非尖峰時間用排程預先將整理好的權限資訊寫入快取。 小弟之前在撈個人的公司組織階層的時候,是搭配Hangfire+Redis(可參考此篇文章),不然每個人登入時,光是從DB取得組織階層就要數秒。 不過快取的保留和更新時間和資料高度相關,以組織的例子來說,通常異動最快會到隔日才生效。
deh iT邦研究生 1 級 ‧ 2020-12-11 10:22:56 檢舉

感謝回覆!目前使用LazyCache(MemoryCache 懶人版)儲存使用者的Menu權限。排程以前都只用windows排程,Hangfire 有機會再來用用看

JB iT邦新手 4 級 ‧ 2020-12-11 10:27:49 檢舉

deh Of course, you rock :)

我要發表回答

立即登入回答