API身份認證JWT

来源:https://www.cnblogs.com/xiaoxi888/archive/2023/07/12/17547386.html
-Advertisement-
Play Games

JWT簡介 是一種身份認證的開放標準(RFC 7519),可以在網路應用間傳輸信息作為Json對象。由三部分組成:頭部(Header)、載荷(payload)和簽名(Signature). 頭部(Header) 兩部分組成,令牌類型和所使用的的簽名演算法 { "alg":"HS256", "typ": ...


JWT簡介

是一種身份認證的開放標準(RFC 7519),可以在網路應用間傳輸信息作為Json對象。由三部分組成:頭部(Header)、載荷(payload)和簽名(Signature).

頭部(Header)

兩部分組成,令牌類型和所使用的的簽名演算法

{

"alg":"HS256""typ":"JWT"

}

 

載荷(payload)

包含要傳輸的信息,包括用戶的身份信息、許可權等。載荷可以自定義,但需要避免包含敏感信息。

{

"sub":"1234567890",

"name":"zuozuo",

"iat":17773219179

}

 

簽名(Signature)

用於驗證令牌的完整性和真實性,通常通過使用頭部和載荷中的數據以及一個密鑰進行加密生成

HMACSHA256(

base64UrlEncode(header)+"."+

base64UrlEncode(payload),

secret

)

 

JWT的工作流程

  • 用戶提供用戶名和密碼進行身份認證
  • 伺服器驗證用戶和密碼的正確性
  • 伺服器使用私鑰簽發JWT,並將其發送給客戶端
  • 客戶端將JWT存儲到本地,例如在瀏覽器的localstorage中。
  • 客戶端在後續的請求中使用JWT進行身份認證,將其放在請求的頭部或其他位置
  • 伺服器接收到請求後,使用公鑰驗證JWT的合法性和完整性。
  • 如果JWT通過驗證,伺服器可以根據載荷中的信息進行授權和許可權驗證。
    • JWT的有點包括不需要在伺服器端存儲會話信息,可擴展性好、跨語言和跨平臺支持等。由於JWT是基於對稱或非對稱加密的,因此需要妥善保管密鑰,以防止令牌被篡改。
  • Asp.Net Core中使用Microsoft.AspNetCore.Authentication.JwtBearer包
  • 配置身份認證服務
    • 在Startup.cs文件的ConfigureServices中添加代碼,以配置JWT身份認證服務
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "NetCoreDemo",
            ValidAudience = "Test",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("!Qq123456Test*"))

        };
    });

 

app.UseAuthentication();
app.UseAuthorization();

 

  • 控制器使用身份認證,需要進行身份認證的控制器或者操作方法上添加[Authorize]標簽
  • 生成JWT
    • 在用戶登錄成功後,可以使用System,IdentityModel.Tokens.Jwt包來生成JWT,
 [HttpPost]
        public IActionResult Login(string username, string password)
        {
            if (username == "admin" && password == "admin")
            {
                var tokenHandler = new JwtSecurityTokenHandler();
                var key = Encoding.UTF8.GetBytes("!Qq123456Test*dsadsadsadsadsa");//密鑰
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = new System.Security.Claims.ClaimsIdentity(
                        new Claim[] {
                            new Claim(ClaimTypes.Name, username)
                        }),
                    Expires = DateTime.UtcNow.AddHours(1),
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                };
                var token = tokenHandler.CreateToken(tokenDescriptor);
                var tokenString = tokenHandler.WriteToken(token);
                return Ok(new { Token = tokenString });
            }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近自動答題的外包很多,來給大家分享一下如何用Python來實現自動答題。 好了話不多說,我們開始操作。 首先你需要準備這些 環境使用 Python 3.8 解釋器 Pycharm 編輯器 模塊使用 import requests > 數據請求模塊 pip install requests impo ...
  • ## 多線程 ### 線程的實現方式 1. 繼承 Thread 類:一旦繼承了 Thread 類,就不能再繼承其他類了,可拓展性差 2. 實現 Runnable 介面:仍然可以繼承其他類,可拓展性較好 3. 使用線程池 #### 繼承Thread 類 ​ 不能通過線程對象調用 run() 方法,需要 ...
  • 與java類似,繼承的出現是為了提高代碼的重覆利用率,避免多次輸入同樣的代碼。而超類就是java中的父類。 # 1.繼承 要指定超類,可在定義類時,在class語句中的類名後加上超類名 * 基類就是超類,派生類就是子類 格式 ``` class Dog: # pass class Bobo(Dog) ...
  • 它來了它來了,最後一期終於來了。理論上該講的全都講完了,只剩下那個拖了好幾期的自定義控制項和一個比較沒有存在感的設置功能沒有講。所以這次就重點介紹它們倆吧。 首先我們快速瀏覽下設置的實現,上圖: 然後是控制器代碼: SettingsController.java package controllers ...
  • 最近用結合thumbnailator和Graphics2D封裝了一個圖片工具類,目前可以實現圖片的裁剪、壓縮、添加圖片水印、文字水印、多行文字水印等功能,同時該工具類的實現使用了建造者模式、責任鏈模式、工廠模式、策略模式等多種設計模式,感覺圖片處理的功能有一定的通用性,所以這次寫一篇文章來分享一下這... ...
  • 博主記得在一個周五快下班的下午,產品找到我(為什麼總感覺周五快下班就來活 😂),跟我說有幾個業務列表查詢需要加上時間條件過濾數據,這個條件可能會變,不保證以後不修改,這個改動涉及到多個列表查詢,於是博主思考了一會想了幾種實現方案, 1. 最簡單,直接將時間條件寫死,由 Service 層傳遞給 D ...
  • 學習數字信號處理演算法時整理的學習筆記。本篇介紹 SSB 單邊帶調幅信號的調製與解調,內附全套 MATLAB 代碼。 ...
  • 解耦 含義 系統各個模塊或組件之間的耦合度降低,使得它們能夠獨立地進行開發、測試、部署和維護。通過解耦,可以提高系統的可維護性、可擴展性和可重用性。 使用場景 將前端和後端分離,通過API介面就行通信,使得前端和後端可以獨立開發、測試和部署。 使用消息隊列解耦生產者和消費者,生產者將消息發送到消息隊 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...