咱們一般理解IdentityServer4是身份認證受權管理系統,那麼咱們能否理解成IdentityServer是身份認證權限管理系統呢?本文咱們來探討下。瀏覽器
經過其名稱可知IdentityServer4就是對於在跨網站或者跨應用程序間爲用戶提供一個穩定的身份,這裏所謂的不可變應該在會話期間用戶身份不可變,好比用戶Id,出生日期等等。微信
可是IdentityServer4並不適合用於讓客戶端或者API知道容許用戶作什麼,好比讀取一篇文檔。數據結構
由於IdentityServer4說到底就是Token服務,可能有了解過IdentityServer4的童鞋說,經過聲明來構建用戶權限啊,其實聲明並非傳輸權限特別好的媒介。爲什麼,固然基於如下幾點緣由。網站
聲明自己就是用來構建用戶的身份而非權限。spa
聲明的數據結構很是簡單僅僅只是字符串,而權限數據結構很是複雜。.net
用戶權限依賴於不一樣的客戶端和APi,將用戶權限放在單個身份中顯然有問題,那麼是否有可能按需獲取呢?這是須要考慮的問題。ci
用戶權限在整個會話期間可能會改變,這個時候須要從新獲取Token,可是獲取Token的方式須要UI交互,這個時候腫麼辦。文檔
權限和業務邏輯可能會有重疊的地方,這個時候如何劃分邊界呢?字符串
有時候咱們可能經過URL傳輸Token,可是瀏覽器URL長度有限制,若是用戶權限存儲在聲明中,豈不是也會出問題?get
基於以上幾點,我我的認爲不能將身份和用戶權限進行混用,說到底IdentityServer4根本不是爲了用戶權限應運而生,也沒提供對應的解決方案,咱們想要實現用戶權限還須要作不少額外的工做。
固然,若是項目小或者私下玩玩將聲明當作權限,而後經過Token返回,並非什麼問題,只不過我想表達的是IdentityServer4不是用做用戶權限的管理系統。
這裏咱們還需引入另一個概念,那就是角色,咱們將身份、角色、權限串聯起來,好像很順暢,用戶的身份屬於什麼角色,對應角色賦予怎樣的權限,這個時候好像彷佛用聲明來授予用戶權限何嘗不可,其實若是對用戶受權是基於用戶的身份,那麼將用戶權限經過聲明來使用是很是可取的。
可能又有人疑惑了,IdentityServer4裏有Scope即範圍,不是可用做用戶權限嗎?請不要隨便扣帽子,IdentityServer4中的Scope指的是授予客戶端權限,而非用戶權限。
本文究竟是闡述了什麼問題呢?
聲明是用來構建身份而不是用戶權限,不能將身份和權限在Token服務中混用,若是對用戶受權是基於用戶的身份,那麼使用聲明也何嘗不可。
咱們來舉一個栗子說明
好比中國和美國對於成年人的定義不同,若是中國是年滿18歲便可進入網吧,而美國是16歲,那麼咱們能夠根據用戶的出生日期即用戶的身份來受權是否可進入網吧,可是若是咱們在聲明中定義鍵爲進入網吧,值爲Ture或者False,這就是權限,這就有問題了,由於權限依賴於客戶端或者APi,單純的如此定義聲明來構造權限很顯然是錯誤的。
聲明用來構建身份而非用戶權限,Scope是授予客戶端權限而非用戶權限
您有何高見,請在評論中留言,歡迎你們一塊兒探討我認爲的多是我認爲的問題。有關IdentityServer4系列也是在連載轉態,已陸續發佈到騰訊課堂上(https://jeffcky.ke.qq.com/)
本文分享自微信公衆號 - JeffckyShare(JeffckyShare)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。