ASP.NET Core 自定义认证方式--请求头认证
Intro
最近開始真正的實(shí)踐了一些網(wǎng)關(guān)的東西,最近寫幾篇文章分享一下我的實(shí)踐以及遇到的問題。
本文主要介紹網(wǎng)關(guān)后面的服務(wù)如何進(jìn)行認(rèn)證。
解決思路
網(wǎng)關(guān)可以做一部分的認(rèn)證和授權(quán),服務(wù)內(nèi)部有時(shí)候也會(huì)需要用戶的信息,這時(shí)該怎么辦呢,我們使用的是 JWT 認(rèn)證,有一個(gè) identity server去頒發(fā),驗(yàn)證 token,一種簡(jiǎn)單方式可以把 token 直接往后傳,傳遞給后面的具體某個(gè)服務(wù),后面的服務(wù)可以去 identity server 拿到公鑰信息去驗(yàn)證 token 的合法性,依然可以拿到用戶的一些基本信息,但又覺得這樣后面的服務(wù)還是要依賴 identityserver 不是太好,因?yàn)檎J(rèn)證已經(jīng)在網(wǎng)關(guān)做掉了,后面不應(yīng)該再去做認(rèn)證的事情了,而且解析 JWT token 也是有一定的性能損耗,于是想把用戶的基本信息在網(wǎng)關(guān)認(rèn)證完成之后放到請(qǐng)求頭中。
我們網(wǎng)關(guān)用的Ocelot,開源的原生 .NET 項(xiàng)目方便自己擴(kuò)展,Ocelot 中有一個(gè) Claims2Headers 可以把 Claims 中的信息轉(zhuǎn)換為請(qǐng)求頭,詳細(xì)使用參見文檔,但是實(shí)現(xiàn)有個(gè)bug,如果有多個(gè)值他只會(huì)取第一個(gè),詳見issue,可以自己擴(kuò)展一個(gè) ocelot 的中間件替換掉原有的中間件。
把用戶信息放到請(qǐng)求頭中,后面的服務(wù)從請(qǐng)求頭中就可以拿到用戶的基本信息了,為了后面的服務(wù)不做過多的改動(dòng),我做了一個(gè)自定義的認(rèn)證,從請(qǐng)求頭中拿用戶的基本信息進(jìn)行認(rèn)證,這樣后面的服務(wù)還是可以直接使用?User.Identity.IsAuthenticated?和?User.Identity.Name?等,不需要做什么改動(dòng)。于是就有了這一根據(jù)請(qǐng)求頭認(rèn)證的項(xiàng)目
實(shí)現(xiàn)效果
下載示例項(xiàng)目,在 TestWebApplication 目錄下運(yùn)行?dotnet run
在瀏覽器中訪問?http://localhost:5000/api/values
使用 postman 或 fiddler (或其它你喜歡的工具)帶上 header 訪問?http://localhost:5000/api/values
使用方式
使用方式可以參考示例項(xiàng)目
使用自定義的 HeaderAuthentication 來替代之前的認(rèn)證方式,默認(rèn)配置了用戶名,用戶id以及用戶角色,如果不能滿足可以在 options 中的?AdditionalHeaderToClaims?中添加更多轉(zhuǎn)換
這樣就可以了,你可以下載示例項(xiàng)目,快速體驗(yàn),你可以直接添加下面幾個(gè)請(qǐng)求頭
UserId 用戶id
UserName 用戶名稱
UserRoles 用戶角色(多個(gè)角色以 , 分割,可以在 options 里自定義多個(gè)值的分隔符
直接訪問需要授權(quán)才能訪問的資源了
現(xiàn)在只是初步的設(shè)想與實(shí)現(xiàn),并已經(jīng)驗(yàn)證確實(shí)可行,代碼還有一些業(yè)務(wù)邏輯比如 UserId 現(xiàn)在是必須的,可以根據(jù)自己需要自行修改,最近有點(diǎn)忙,找時(shí)間再修改重構(gòu)一下再發(fā)布 nuget 包。如果有什么需求或問題,歡迎一起探討。
源碼
自定義認(rèn)證源碼
提供了 HeaderAuthetication 和 QueryAuthentication 兩種實(shí)現(xiàn),一種使用請(qǐng)求頭信息認(rèn)證,一種使用 QueryString 信息認(rèn)證。
HeaderAuthetication 主要實(shí)現(xiàn)在?HeaderAuthenticationHandler
核心代碼,重寫 Authenticate 方法:
注意
請(qǐng)注意,如果使用這種方式,請(qǐng)確保你的服務(wù)不會(huì)被外界直接訪問,請(qǐng)求只能從網(wǎng)關(guān)或者本地調(diào)試發(fā)起。需要保證安全性,不能直接暴露到公網(wǎng),才能使用這種方式。
原文地址:https://www.cnblogs.com/weihanli/p/10464507.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 自定义认证方式--请求头认证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动将 NuGet 包的引用方式从 pa
- 下一篇: Asp.NETCore轻松学系列阅读指引