日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

發(fā)布時間:2023/12/4 asp.net 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上篇文章介紹了基于Ids4密碼授權模式,從使用場景、原理分析、自定義帳戶體系集成完整的介紹了密碼授權模式的內容,并最后給出了三個思考問題,本篇就針對第一個思考問題詳細的講解下Ids4是如何生成access_token的,如何驗證access_token的有效性,最后我們使用.net webapi來實現(xiàn)一個外部接口(本來想用JAVA來實現(xiàn)的,奈何沒學好,就當拋磚引玉吧,有會JAVA的朋友根據我寫的案例使用JAVA來實現(xiàn)一個案例)。

.netcore項目實戰(zhàn)交流群(637326624),有興趣的朋友可以在群里交流討論。

一、JWT簡介

  • 什么是JWT?
    JSON Web Token (JWT)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。該信息可以被驗證和信任,因為它是數字簽名的。

  • 什么時候使用JWT?

  • 1)、認證,這是比較常見的使用場景,只要用戶登錄過一次系統(tǒng),之后的請求都會包含簽名出來的token,通過token也可以用來實現(xiàn)單點登錄。

    2)、交換信息,通過使用密鑰對來安全的傳送信息,可以知道發(fā)送者是誰、放置消息是否被篡改。

  • JWT的結構是什么樣的?

  • JSON Web Token由三部分組成,它們之間用圓點(.)連接。這三部分分別是:

    • Header

    • Payload

    • Signature

    Header
    header典型的由兩部分組成:token的類型(“JWT”)和算法名稱(比如:HMAC SHA256或者RSA等等)。

    例如:

    然后,用Base64對這個JSON編碼就得到JWT的第一部分

    Payload

    JWT的第二部分是payload,它包含聲明(要求)。聲明是關于實體(通常是用戶)和其他數據的聲明。聲明有三種類型: registered, public 和 private。

    • Registered claims : 這里有一組預定義的聲明,它們不是強制的,但是推薦。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。

    • Public claims : 可以隨意定義。

    • Private claims : 用于在同意使用它們的各方之間共享信息,并且不是注冊的或公開的聲明。

    下面是一個例子:

    對payload進行Base64編碼就得到JWT的第二部分

    注意,不要在JWT的payload或header中放置敏感信息,除非它們是加密的。

    Signature

    為了得到簽名部分,你必須有編碼過的header、編碼過的payload、一個秘鑰,簽名算法是header中指定的那個,然對它們簽名即可。

    例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

    簽名是用于驗證消息在傳遞過程中有沒有被更改,并且,對于使用私鑰簽名的token,它還可以驗證JWT的發(fā)送方是否為它所稱的發(fā)送方。

    二、IdentityServer4是如何生成jwt的?

    在了解了JWT的基本概念介紹后,我們要知道JWT是如何生成的,加密的方式是什么,我們如何使用自己的密鑰進行加密。

    IdentityServer4的加密方式?

    Ids4目前使用的是RS256非對稱方式,使用私鑰進行簽名,然后客戶端通過公鑰進行驗簽。可能有的人會問,我們在生成Ids4時,也沒有配置證書,為什么也可以運行起來呢?這里就要講解證書的使用,以及Ids4使用證書的加密流程。

    1、加載證書

    Ids4默認使用臨時證書來進行token的生成,使用代碼?.AddDeveloperSigningCredential(),這里會自動給生成tempkey.rsa證書文件,所以項目如果使用默認配置的根目錄可以查看到此文件,實現(xiàn)代碼如下:

    這也就可以理解為什么沒有配置證書也一樣可以使用了。

    注意:在生產環(huán)境我們最好使用自己配置的證書。

    如果我們已經有證書了,可以使用如下代碼實現(xiàn),至于證書是如何生成的,網上資料很多,這里就不介紹了。

    .AddSigningCredential(new X509Certificate2(Path.Combine(basePath,"test.pfx"),"123456"));

    然后注入證書相關信息,代碼如下:

    builder.Services.AddSingleton<ISigningCredentialStore>(new DefaultSigningCredentialsStore(credential));builder.Services.AddSingleton<IValidationKeysStore>(new DefaultValidationKeysStore(new[] { credential.Key }));

    后面就可以在項目里使用證書的相關操作了,比如加密、驗簽等。

    2、使用證書加密

    上篇我介紹了密碼授權模式,詳細的講解了流程,當所有信息校驗通過,Claim生成完成后,就開始生成token了,核心代碼如下。

    知道了這些原理后,我們就能清楚的知道access_token都放了那些東西,以及我們可以如何來驗證生成的Token。

    三、如何驗證access_token的有效性?

    知道了如何生成后,最主要的目的還是要直接我們服務端是如何來保護接口安全的,為什么服務端只要加入下代碼就能夠保護配置的資源呢?

    在理解這個前,我們需要了解系統(tǒng)做的驗證流程,這里使用一張圖可以很好的理解流程了。


    看完后是不是豁然開朗?這里就可以很好的理解/.well-known/openid-configuration/jwks原來就是證書的公鑰信息,是通過訪問/.well-known/openid-configuration暴露給所有的客戶端使用,安全性是用過非對稱加密的原理保證,私鑰加密的信息,公鑰只能驗證,所以也不存在密鑰泄漏問題。

    雖然只是短短的幾句代碼,就做了那么多事情,這說明Ids4封裝的好,減少了我們很多編碼工作。這是有人會問,那如果我們的項目不是.netcore的,那如何接入到網關呢?

    網上有一個Python例子,用 Identity Server 4 (JWKS 端點和 RS256 算法) 來保護 Python web api.

    本來準備使用Java來實現(xiàn),好久沒摸已經忘了怎么寫了,留給會java的朋友實現(xiàn)吧,原理都是一樣。

    下面我就已webapi為例來開發(fā)服務端接口,然后使用Ids4來保護接口內容。

    新建一個webapi項目,項目名稱Czar.AuthPlatform.WebApi,為了讓輸出的結果為json,我們需要在WebApiConfig增加config.Formatters.Remove(config.Formatters.XmlFormatter);代碼,然后修改默認的控制器ValuesController,修改代碼如下。

    為了保護api安全,我們需要增加一個身份驗證過濾器,實現(xiàn)代碼如下。

    代碼非常簡潔,就實現(xiàn)了基于Ids4的訪問控制,現(xiàn)在我們開始使用PostMan來測試接口地址。

    我們直接請求接口地址,返回401未授權。

    然后我使用Ids4生成的access_token再次測試,可以得到我們預期結果。

    為了驗證是不是任何地方簽發(fā)的token都可以通過驗證,我使用其他項目生成的access_token來測試,發(fā)現(xiàn)提示的401未授權,可以達到我們預期結果。

    現(xiàn)在就可以開心的使用我們熟悉的webapi開發(fā)我們的接口了,需要驗證的地方增加類似[Ids4Auth("http://localhost:6611", "mpc_gateway")]代碼即可。

    使用其他語言實現(xiàn)的原理基本一致,就是公鑰來驗簽,只要通過驗證證明是允許訪問的請求,由于公鑰一直不變(除非認證服務器更新了證書),所以我們請求到后可以緩存到本地,這樣驗簽時可以省去每次都獲取公鑰這步操作。

    四、總結

    本篇我們介紹了JWT的基本原理和Ids4的JWT實現(xiàn)方式,然后使用.NET webapi實現(xiàn)了使用Ids4保護接口,其他語言實現(xiàn)方式一樣,這樣我們就可以把網關部署后,后端服務使用任何語言開發(fā),然后接入到網關即可。

    有了這些知識點,感覺是不是對Ids4的理解更深入了呢?JWT確實方便,但是有些特殊場景是我們希望Token在有效期內通過人工配置的方式立即失效,如果按照現(xiàn)有Ids4驗證方式是沒有辦法做到,那該如何實現(xiàn)呢?我將會在下一篇來介紹如何實現(xiàn)強制token失效,敬請期待吧。

    相關文章:

    • AspNetCore中使用Ocelot之 IdentityServer4

    • Ocelot-基于.NET Core的開源網關實現(xiàn)

    • .NET Core微服務之基于Ocelot+IdentityServer實現(xiàn)統(tǒng)一驗證與授權

    • Swagger如何訪問Ocelot中帶權限驗證的API

    • Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包

    • .NET Core微服務之基于Ocelot實現(xiàn)API網關服務

    • .NET Core微服務之基于Ocelot實現(xiàn)API網關服務(續(xù))

    • .NET微服務體系結構中為什么使用Ocelot實現(xiàn)API網關

    • Ocelot簡易教程(一)之Ocelot是什么

    • Ocelot簡易教程(二)之快速開始1

    • Ocelot簡易教程(二)之快速開始2

    • Ocelot簡易教程(三)之主要特性及路由詳解

    • Ocelot簡易教程(四)之請求聚合以及服務發(fā)現(xiàn)

    • Ocelot簡易教程(五)之集成IdentityServer認證以及授權

    • Ocelot簡易教程(六)之重寫配置文件存儲方式并優(yōu)化響應數據

    • Ocelot簡易教程(七)之配置文件數據庫存儲插件源碼解析

    • ASP.NET Core中Ocelot的使用:API網關的應用

    • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的動態(tài)路由

    • ASP.NET Core中Ocelot的使用:基于服務發(fā)現(xiàn)的負載均衡

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第一章 功能及架構分析

    • 定制Ocelot來滿足需求

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第三章 網關篇-數據庫存儲配置(1)

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第四章 網關篇-數據庫存儲配置(2)

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第五章 網關篇-自定義緩存Redis

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第六章 網關篇-自定義客戶端授權

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第七章 網關篇-自定義客戶端限流

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第八章 授權篇-IdentityServer4源碼分析

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第九章 授權篇-使用Dapper持久化IdentityServer4

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第十章 授權篇-客戶端授權

    • 【.NET Core項目實戰(zhàn)-統(tǒng)一認證平臺】第十一章 授權篇-密碼授權模式

    原文地址:?https://www.cnblogs.com/jackcao/p/10195351.html

    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


    總結

    以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。