【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解
歡迎大家閱讀《朝夕Net社區技術專刊》第6期
我們致力于.NetCore的推廣和落地,為更好的幫助大家學習,方便分享干貨,特創此刊!很高興你能成為忠實讀者,文末福利不要錯過哦!
前言:
本部分文檔將詳細給大家介紹CoreWebApi的Authorize鑒權授權;為什么要鑒權授權呢?如果沒有啟用身份認證,那么任何匿名用戶只要知道了我們服務的url,就能隨意訪問我們的服務接口,從而訪問或修改數據庫。所以在各種系統開發中授權是必備的;今天這里就給大家說說授權的事兒。
01
PART
傳統方式的授權
請看下圖,在傳統授權中,因為Http請求是沒有狀態的,http請求第一次請求和第二次請求是沒有關系的,所有在傳統的授權方式里面使用的是Session+Cookes;Session使用的較多;思路:客戶端(瀏覽器)第一次請求服務器的時候,服務器針對于當前這個瀏覽器生成一個Session:Key-value形式,SessionId:Session值;客戶端來登錄獲取權限的時候,服務器然后在響應請求的時候,把SessionId返回給客戶端瀏覽器;瀏覽器把SessionId保存在cookies中,再次去請求服務器的時候帶上這個SessionId的標識,然后服務器就可以識別到,這是上次某某某瀏覽器來訪問過我,登陸過,這個SessionId是我服務器頒發的,就通過了權限認證了。
基于Session cookies的權限校驗是比較傳統的,也是最常見的,不過基于Session、Cookies的權限校驗,存在一些尷尬事兒。
因為Session是存儲在服務器的,在一些大型分布集群服務器中,Session共享的問題不太好解決(當然這里不是說不能解決),比方說有A/B/C/D四個服務器集群,那么登錄時候如果是A服務器生成的Session,那么B服務器是不能用的;需要做Session共享,成本相對來說較高;
像大家在使用一些系統的時候,常常會見到一些像QQ、微信、淘寶賬號 這類第三方賬號登錄,如果使用Cookies和Session來實現,成本很高;
02
PART
基于令牌的鑒權授權——Basic授權
在Asp.NetWebApi中可以使用Basic授權;Basic授權是基于令牌的,在登錄的時候,服務器給頒發一個tiket(這里可以理解成一個鑰匙),然后你去訪問Api的時候,把這個tiket給帶上,就可以通過校驗;Basic認證實現起來非常簡單;下面我把代碼貼在這里供大家參考。
圖1
注:就是在用戶登錄的時候通過在請求登錄的時候傳遞的參數生成一個Tiket;使用PostMan調用如圖2所示;
圖2
那么有tiket了,在調用Api的時候,就需要驗證這個tiket了,怎么驗證呢?Richard老師這里是使用Asp.NetMVC中的Filter---AuthorizeAttribute來實現的。
圖3
定義個Api:GetUserInfo.
在沒有標記任何Filter的時候,通過Ajax請求Api;結果可以正常拿到,請看圖4、圖5
圖4
圖5
那標記特性以后呢?請看圖6;圖7
圖6
圖7
請求結果拿不到,因為在請求WebApi的時候沒有把tiket帶上。請看圖8、圖9、圖10;
圖8
圖9
圖10
現在可以正常調用Api獲取到數據;那么Basic的流程如下:
1.????獲取tiket;
2.????在調用Api的時候,把tiket帶上;通過驗證tiket的來達到授權的效果;
03
PART
基于令牌的鑒權授權——Jwt鑒權授權
Jwt鑒權:Json Web Token是在.NetCore中最主流的鑒權授權方式,這里Richard老師準備給大家詳細解讀Jwt鑒權授權的核心思路;請看圖1
圖1
圖1為jwt鑒權授權的架構圖,圖1中分別有四個角色,客戶端-User,鑒權中心AuthorziationServer,資源提供-Api, ?第三方Api-Third-Party。
根據圖中的流程:
?請求鑒權中心AuthorziationServer(根據賬號密碼到鑒權中心登錄),獲取Token
去請求資源Api 或者第三方Api Third-Party 的時候帶上token,就可以獲取數據;
小伙伴兒在看到這個圖以后,可能會覺得奇怪,資源Api并沒有和鑒權中心AuthorizatinServer發生交互,是怎么驗證權限的呢?這其實是Jwt鑒權的一大特點;
那是怎么鑒權的呢?下面就給大家解惑一下:
其實鑒權中心在生成Token, ?Api在通過Token驗證權限的時候,這二者或有一個非對稱可逆加密解密的過程;
1.????鑒權中心兜兒里有一個私鑰,用來加密;私鑰是私密的,只有鑒權中心知道;
2.????資源Api或者第三方Api Thrid-Party兜兒里有一個和鑒權中的那個私鑰對應的解密公鑰,就是鑒權中心私鑰加密,資源Api,公鑰解密;公鑰是公開的;誰都是知道的;
【這里涉及到有非對稱加密解密的知識,如果對這一塊的內容不是很理解的,可以聯系QQ: 1432568536獲取關于加密解密的內容】
?
那么鑒權中心和資源Api之間是怎么完成的呢?
?在鑒權中心,登錄以后,生成的Token是通過私鑰加密的,這里就只有公鑰能解開。
?在請求Api的時候,資源Api有公鑰,那么資源Api就去嘗試解密,如果能解開,說明這個Token確實是來自于鑒權中心,那OK,那資源Api就通過校驗,正常返回數據;否則就表示沒有權限。
下面給大家介紹一下這個Token的內容結構:如圖2,是一段標準的Token內容;一共分為三段。?
圖2
第一段:頭信息,紅色部分,圖3所示,表示加密算法:HS256,類型是jwt鑒權;
圖3
第二段:圖4所示:紫色部分,表示有效載荷,也就是在這個Token里面可以攜帶一些信息,有Token標準的信息內容,也可以自定義加一些內容。
圖4
第三段:簽名
簽名Signature
=HMACSHA256( base64UrlEncode(頭信息) + "." +? base64UrlEncode(有效載荷信息),? 公鑰)
通過HMACSHA256 算法加密 +.+ ?Base64位的頭信息+.+Base64位的有效載荷信息+.+公鑰;三段內容通過點連接起來形成一個完整的Token 令牌。
那Token里的內容能修改嗎?不能修改,如果修改過了,內容解密后,跟真實內容就不一樣了;下面就基于Jwt在Core環境下做一個實現。
如果圖1中所示,得有一個鑒權中心專門用來頒發Token;
圖5
這里使用到了一個JwtService: 如圖6jwtService 實現;
1.需要Nuget引入程序包:Microsoft.IdentityModel.Tokens
????????????? Nuget引入程序包:System.IdentityModel.Tokens.Jwt
圖6
2.需要在配置文件里配置:如圖7所示
圖7
【這部分的代碼可以聯系朝夕教育助教老師獲取:QQ: 1432568536】如此鑒權中心就OK了;那Api部分呢?下面將繼續說說Api如何基于Jwt授權。
1. ?? CoreWebApi需要在Startup 下的ConfigureServices中增加如下代碼:
如圖8所示
圖8
2.在Startup中的Configure中指定使用授權;如圖9所示;
圖9
3.???在資源Api中標記特性;如圖10所示。
圖10
測試:
第一步:命令啟動WebApi: dotnet Zhaoxi.Core.WebApi.dll --urls="http://*:8004" --?? ?????? ?????? ???? ???????ip="127.0.0.1" --port= 8004
如圖11所示:
圖11
第二步:PostMan 請求Api;圖12所示,表示沒有授權;所以需要授權,那怎么授權呢?需要啟動鑒權中心,獲取令牌Toke
圖12
第三步:命令啟動鑒權中心:dotnet Zhaoxi.Core.AuthenticationCenter.dll --urls="http://*:8001" --??? ?????? ? ???? ?????? ip="127.0.0.1" --port= 8001
如圖13所示
圖13
第四步:PostMan請求獲取Token;如圖14所示:
圖14
第五步:圖14獲取到了Toke, 就可以帶上token 請求Api,正常獲取數據,圖15,圖16所示。
圖15
圖16
以上就是整套的Jwt權限驗證過程,使用的是Jwt鑒權授權。
總結
以上是生活随笔為你收集整理的【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第22课:异
- 下一篇: Blazor入门