三分钟学会.NET Core Jwt 策略授权认证
一.前言
大家好我又回來了,前幾天講過一個關于Jwt的身份驗證最簡單的案例,但是功能還是不夠強大,不適用于真正的項目,是的,在真正面對復雜而又苛刻的客戶中,我們會不知所措,就現在需要將認證授權這一塊也變的復雜而又實用起來,那在專業術語中就叫做自定義策略的API認證,本次案例運行在.NET Core 3.0中,最后我們將在swagger中進行瀏覽,來嘗試項目是否正常,對于.NET Core 2.x 版本,這篇文章有些代碼不適用,但我會在文中說明。
二.在.NET Core中嘗試
我們都知道Jwt是為了認證,微軟給我們提供了進城打鬼子的城門,那就是?AuthorizationHandle。
我們首先要實現它,并且我們還可以根據依賴注入的?AuthorizationHandlerContext?來獲取上下文,就這樣我們就更可以做一些權限的手腳
首先,我們重寫了?HandleRequirementAsync?方法,如果你看過AspNetCore的源碼你一定知道,它是Jwt身份認證的開端,也就是說你重寫了它,原來那一套就不會走了,我們觀察一下源碼,我貼在下面,可以看到這就是一個最基本的授權,通過?context.Succeed(requirement?完成了最后的認證動作!
那么 ?Succeed ?是一個什么呢?它是一個在 ?AuthorizationHandlerContext的定義動作,包括Fail() ,也是如此,當然具體實現我們不在細談,其內部還是挺復雜的,不過我們需要的是 ?DenyAnonymousAuthorizationRequirement ?被當作了抽象的一部分。
好吧,言歸正傳(看源碼挺刺激的),我們剛剛在 ?PolicyHandler實現了自定義認證策略,上面還說到了兩個方法?,F在我們在項目中配置并啟動它,并且我在代碼中也是用了Swagger用于后面的演示。
在 ?AddJwtBearer中我們添加了jwt驗證包括了驗證參數以及幾個事件處理,這個很基本,不在解釋。不過在Swagger中添加jwt的一些功能是在??AddSecurityDefinition? 中寫入的。
在以上代碼中,我們通過鑒權模式添加了認證規則,一個名叫 ?PolicyRequirement ?的類,它實現了 ?IAuthorizationRequirement ?接口,其中我們需要定義一些規則,通過構造函數我們可以添加我們要識別的權限規則。那個UserName就是 Attribute 。
隨后我們應當啟動我們的服務,在.NET Core 3.0 中身份驗證的中間件位置需要在路由和端點配置的中間。
我們通常會有一個獲取token的API,用于讓Jwt通過? JwtSecurityTokenHandler().WriteToken(token) ?用于生成我們的token,雖然jwt是沒有狀態的,但你應該也明白,如果你的jwt生成了隨后你重啟了你的網站,你的jwt會失效,這個是因為你的密鑰進行了改變,如果你的密鑰一直寫死,那么這個jwt將不會再過期,這個還是有安全風險的,這個我不在這里解釋,gettoken定義如下:
可能比較特別的是??AllowAnonymous? ,這個看我文章的同學可能頭一次見,其實怎么說好呢,這個可無可有,沒有硬性的要求,我看到好幾個知名博主加上了,我也加上了~...最后我們創建了幾個資源控制器,它們是受保護的。
在你添加策略權限的時候例如政策名稱是XXX,那么在對應的api表頭就應該是XXX,隨后到了 ?PolicyHandler我們解析了 Claims 處理了它是否有權限。
三.效果圖
四.栗子源代碼和以往版本
看到很多前輩彩的坑,原來的??(context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint);? 實際上在.NET Core 3.0 已經不能用了,原因是.NET Core 3.0 啟用 EndpointRouting 后,權限filter不再添加到 ActionDescriptor ,而將權限直接作為中間件運行,同時所有filter都會添加到? endpoint.Metadata? ,如果在.NET Core 2.1 & 2.2 版本中你通常Handler可以這么寫:
該案例源代碼在我的Github上:https://github.com/zaranetCore/aspNetCore_JsonwebToken/tree/master/Jwt_Policy_Demo? 謝謝大家
總結
以上是生活随笔為你收集整理的三分钟学会.NET Core Jwt 策略授权认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法专题——第四题 字符串相似
- 下一篇: [温故知新] 编程原则和模式