C#中如何運用JWT用戶認證

一、JWT概述

JSON Web Token(JWT)是一種輕量級的身份認證機制,廣泛應用于分布式系統中的用戶認證。它通過緊湊的JSON格式存儲用戶身份信息,并使用數字簽名確保信息的完整性和真實性。與傳統的基于Session的認證相比,JWT具有無狀態、可擴展、跨平臺等優勢,特別適合于微服務架構和前后端分離的應用場景。

JWT的核心優勢在于:

  • 無狀態:服務器不需要存儲會話信息,減輕服務器負擔

  • 跨平臺:基于標準JSON格式,可在不同語言和平臺間傳遞

  • 自包含:令牌包含所有必要的用戶信息,減少數據庫查詢

  • 可擴展:支持自定義聲明,滿足不同業務需求

  • 安全性:通過數字簽名確保信息不被篡改

二、JWT工作原理

JWT認證的核心流程如下:

  1. 用戶登錄:用戶提供用戶名和密碼進行登錄

  2. 生成Token:服務器驗證成功后,生成包含用戶身份信息的JWT令牌

  3. 返回Token:服務器將JWT令牌返回給客戶端

  4. 存儲Token:客戶端存儲JWT令牌(通常存儲在localStorage或Cookie中)

  5. 請求攜帶Token:客戶端后續請求時,在HTTP頭部攜帶JWT令牌

  6. 驗證Token:服務器驗證JWT令牌的有效性(簽名驗證、過期時間檢查等)

  7. 處理請求:驗證通過后,服務器處理請求并返回結果

JWT認證流程圖

+----------+ ? ? 登錄請求 ? ?  +----------+
| ? ? ? ?  | -------------->  | ? ? ? ?  |
| 客戶端 ? | ? ? ? ? ? ? ? ? ? | 服務器 ? |
| ? ? ? ?  | <--------------  | ? ? ? ?  |
+----------+ ? 返回JWT令牌 ? ? +----------+| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? || ? 攜帶JWT令牌的請求 ? ? ? ? ? ? ? || ----------------------------->  || ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? || <-----------------------------  || ? ? ?  處理后的響應 ? ? ? ? ? ? ? |v ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? v

三、JWT結構組成

JWT令牌由三部分組成,用小數點(.)分隔,格式為Header.Payload.Signature:

1. Header(頭部)

Header部分包含令牌類型(typ)和加密算法(alg),通常如下:

{"alg": "HS256","typ": "JWT"
}

其中,alg表示使用的加密算法(如HS256、RS256等),typ表示令牌類型。

2. Payload(載荷)

Payload部分包含用戶身份信息和其他元數據,分為標準聲明和自定義聲明:

  • 標準聲明

    • iss:令牌頒發者

    • sub:令牌主題(通常是用戶ID)

    • aud:令牌受眾

    • exp:令牌過期時間

    • iat:令牌頒發時間

    • nbf:令牌生效時間

    • jti:令牌唯一標識符

  • 自定義聲明:根據業務需求定義的字段,如用戶角色、權限等。

示例:

{"sub": "1234567890","name": "John Doe","role": "admin","exp": 1678900000
}

3. Signature(簽名)

Signature部分是對Header和Payload的簽名,用于驗證令牌的完整性和真實性。服務器使用Header中指定的算法,結合密鑰對Header和Payload進行簽名:

PlainText
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secretKey
)

四、C#中實現JWT認證

1. 安裝必要的包

在C#項目中,我們需要安裝以下NuGet包:

  • System.IdentityModel.Tokens.Jwt:用于生成和驗證JWT令牌

  • Microsoft.AspNetCore.Authentication.JwtBearer:提供JWT身份驗證中間件

Install-Package System.IdentityModel.Tokens.Jwt
Install-Package Microsoft.AspNetCore.
Authentication.JwtBearer

2. 配置JWT認證服務

在Program.cs文件中,添加JWT認證服務配置:

Program.cs 
using Microsoft.AspNetCore.Authentication.
JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
?
var builder = WebApplication.CreateBuilder(args);
?
// 添加JWT認證服務
builder.Services.AddAuthentication
(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true, // 驗證頒發者ValidateAudience = true, // 驗證受眾ValidateLifetime = true, // 驗證過期時間ValidateIssuerSigningKey = true, // 驗證簽名密鑰ValidIssuer = builder.Configuration["Jwt:Issuer"], // 頒發者ValidAudience = builder.Configuration["Jwt:Audience"], // 受眾IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])) // 簽名密鑰};});
?
// 添加授權服務
builder.Services.AddAuthorization();
?
var app = builder.Build();
?
// 使用認證和授權中間件
app.UseAuthentication();
app.UseAuthorization();
?
app.MapControllers();
app.Run();

3. 配置appsettings.json

在appsettings.json文件中添加JWT相關配置:

appsettings.json
應用
{"Jwt": {"Issuer": "YourIssuer","Audience": "YourAudience","SecretKey": "YourSecretKeyHereShouldBeLongEnough"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}

4. 生成JWT令牌

創建一個AuthController,實現用戶登錄和生成JWT令牌的功能:

AuthController.cs
?
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
?
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{private readonly IConfiguration _configuration;
?public AuthController(IConfiguration configuration){_configuration = configuration;}
?[HttpPost("login")]public IActionResult Login([FromBody] LoginRequest request){// 驗證用戶憑據(實際應用中應查詢數據庫)if (request.Username == "admin" && request.Password == "password"){// 創建用戶聲明var claims = new[]{new Claim(ClaimTypes.Name, request.Username),new Claim(ClaimTypes.Role, "admin"),new Claim(JwtRegisteredClaimNames.Sub, "1234567890"),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())};
?// 生成對稱安全密鑰var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
?// 生成簽名憑據var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
?// 創建JWT令牌var token = new JwtSecurityToken(issuer: _configuration["Jwt:Issuer"],audience: _configuration["Jwt:Audience"],claims: claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds);
?// 返回JWT令牌return Ok(new{token = new JwtSecurityTokenHandler().WriteToken(token),expiration = token.ValidTo});}
?return Unauthorized();}
}
?
public class LoginRequest
{public string Username { get; set; }public string Password { get; set; }
}

5. 保護API端點

使用[Authorize]屬性保護API端點,只有攜帶有效JWT令牌的請求才能訪問:

ValuesController.cs
?
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
?
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ValuesController : ControllerBase
{[HttpGet]public IActionResult Get(){return Ok(new string[] { "value1", "value2" });}
?[HttpGet("{id}")][Authorize(Roles = "admin")]public IActionResult Get(int id){return Ok($"value {id}");}
}

五、JWT認證的注意事項

  1. 密鑰安全:確保JWT密鑰安全存儲,避免硬編碼在代碼中

  2. 令牌過期時間:設置合理的令牌過期時間,平衡安全性和用戶體驗

  3. HTTPS傳輸:使用HTTPS協議傳輸JWT令牌,防止中間人攻擊

  4. 令牌刷新機制:實現令牌刷新機制,避免用戶頻繁登錄

  5. 敏感信息:不要在JWT中存儲敏感信息,如密碼等

  6. 權限控制:結合角色和權限聲明,實現細粒度的訪問控制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92917.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hibernate 使用詳解

在現代的Java開發中&#xff0c;數據持久化是一個至關重要的環節。而在眾多持久化框架中&#xff0c;Hibernate以其強大的功能和靈活性&#xff0c;成為了開發者們的首選工具。本文將詳細介紹Hibernate的原理、實現過程以及其使用方法&#xff0c;希望能為廣大開發者提供一些有…

【圖像算法 - 13】基于 YOLO12 與 OpenCV 的實時目標點擊跟蹤系統(系統介紹 + 源碼詳細)

基于 YOLO12 與 OpenCV 的實時點擊目標跟蹤系統 在計算機視覺領域&#xff0c;目標檢測與跟蹤是兩個核心任務。本文將介紹一個結合 YOLO 目標檢測模型與 OpenCV 跟蹤算法的實時目標跟蹤系統&#xff0c;該系統允許用戶通過鼠標交互選擇特定目標進行持續跟蹤&#xff0c;支持多…

【數據庫】 MySQL 表的操作詳解

在 MySQL 數據庫的日常開發與維護中&#xff0c;表的操作是最基礎且最常用的部分。本文將從 創建表、查看表結構、修改表 以及 刪除表 等方面進行詳細講解&#xff0c;并附上對應的 SQL 語句示例&#xff0c;方便在實際項目中直接應用。一、創建表 1.1 創建表語法 CREATE TABLE…

DiT: Transformer上的擴散模型

論文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代碼和工程網頁&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首個基于Transformer架構的擴散模型&#xff01;它在…

MySQL 索引:索引為什么使用 B+樹?(詳解B樹、B+樹)

文章目錄一、二叉查找樹(BST)&#xff1a;不平衡二、平衡二叉樹(AVL)&#xff1a;旋轉耗時三、紅黑樹&#xff1a;樹太高由一個例子總結索引的特點基于哈希表實現的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找樹升級版的BST樹&#xff1a;AVL 樹四、…

ESP32入門開發·VScode空白項目搭建·點亮一顆LED燈

目錄 1. 環境搭建 2. 創建項目 3. 調試相關介紹 4. 代碼編寫 4.1 包含頭文件 4.2 引腳配置 4.3 設置輸出電平 4.4 延時函數 4.5 調試 1. 環境搭建 默認已經搭建好環境&#xff0c;如果未搭建好可參考&#xff1a; ESP32入門開發Windows平臺下開發環境的搭建…

ONLYOFFICE AI 智能體上線!與編輯器、新的 AI 提供商等進行智能交互

ONLYOFFICE AI 插件?迎來重要更新&#xff0c;帶來了新功能和更智能的交互體驗。隨著 AI 智能體&#xff08;現為測試版&#xff09;的上線、帶來更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已經成為功能強大的文檔智能助理。 關于 ONLYOFFICE ONLYOFFICE 文檔是多…

【C++進階學習】第十一彈——C++11(上)——右值引用和移動語義

前言&#xff1a; 前面我們已經將C的重點語法講的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出來了很多新的語法&#xff0c;其中有一些作用還是非常大的&#xff0c;今天我們就先來學習其中一個很重要的點——右值引用以及它所擴展的移動定義 目錄 一、左值引用和…

【IoTDB】363萬點/秒寫入!IoTDB憑何領跑工業時序數據庫賽道?

【作者主頁】Francek Chen 【專欄介紹】???大數據與數據庫應用??? 大數據是規模龐大、類型多樣且增長迅速的數據集合&#xff0c;需特殊技術處理分析以挖掘價值。數據庫作為數據管理的關鍵工具&#xff0c;具備高效存儲、精準查詢與安全維護能力。二者緊密結合&#xff0…

IEEE 2025 | 重磅開源!SLAM框架用“法向量+LRU緩存”,將三維重建效率飆升72%!

一、前言 當前研究領域在基于擴散模型的文本到圖像生成技術方面取得了顯著進展&#xff0c;尤其在視覺條件控制方面。然而&#xff0c;現有方法&#xff08;如ControlNet&#xff09;在組合多個視覺條件時存在明顯不足&#xff0c;主要表現為獨立控制分支在去噪過程中容易引入…

無人機遙控器教練模式技術要點

一、技術要點1.控制權仲裁機制&#xff1a;核心功能&#xff1a;清晰定義主控權歸屬邏輯&#xff08;默認為學員&#xff0c;但教練隨時可接管&#xff09;。切換方式&#xff1a;通常通過教練遙控器上的物理開關&#xff08;瞬時或鎖定型&#xff09;或軟件按鈕觸發。切換邏輯…

【跨服務器的數據自動化下載--安裝公鑰,免密下載】

跨服務器的數據自動化下載功能介紹&#xff1a;上代碼&#xff1a;發現好久沒寫csdn了&#xff0c;說多了都是淚~~ 以后會更新一些自動化工作的腳本or 小tricks&#xff0c;歡迎交流。分享一個最近在業務上寫的較為實用的自動化腳本&#xff0c;可以批量從遠端服務器下載指定數…

C++-->stl: list的使用

前言list的認識list是可以在固定時間&#xff08;O&#xff08;1&#xff09;&#xff09;內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 2. list的底層是雙向鏈表結構&#xff0c;雙向鏈表中每個元素存儲在互不相關的獨立節點中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 總結字幕

1. 實現功能 M4-1 接入 whisper ollama qwen3:14b 總結字幕 自動下載視頻元數據如果有字幕&#xff0c;只下載字幕使用 ollama 的 qwen3:14b 對字幕內容進行總結 2.運行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取視頻元數據… &#x1f4dd; 正在…

《Linux運維總結:Shell腳本高級特性之變量間接調用》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、變量間接調用 在Shell腳本中&#xff0c;變量間接調用是一種高級特性&#xff0c;它允許你通過另一個變量的值來動態地訪問…

ABP VNext + Akka.NET:高并發處理與分布式計算

ABP VNext Akka.NET&#xff1a;高并發處理與分布式計算 &#x1f680; 用 Actor 模型把高并發寫入“分片→串行化”&#xff0c;把鎖與競態壓力轉回到代碼層面的可控順序處理&#xff1b;依托 Cluster.Sharding 橫向擴容&#xff0c;Persistence 宕機可恢復&#xff0c;Strea…

[激光原理與應用-250]:理論 - 幾何光學 - 透鏡成像的優缺點,以及如克服缺點

透鏡成像是光學系統中應用最廣泛的技術&#xff0c;其通過折射原理將物體信息轉換為圖像&#xff0c;但存在像差、環境敏感等固有缺陷。以下是透鏡成像的優缺點及針對性改進方案&#xff1a;一、透鏡成像的核心優點高效集光能力透鏡通過曲面設計將分散光線聚焦到一點&#xff0…

測試匠談 | AI語音合成之大模型性能優化實踐

「測試匠談」是優測云服務平臺傾心打造的內容專欄&#xff0c;匯集騰訊各大產品的頂尖技術大咖&#xff0c;為大家傾囊相授開發測試領域的知識技能與實踐&#xff0c;讓測試工作變得更加輕松高效。 本期嘉賓介紹 Soren&#xff0c;騰訊TEG技術事業群質量工程師&#xff0c;負責…

用天氣預測理解分類算法-從出門看天氣到邏輯回歸

一、生活中的決策難題&#xff1a;周末郊游的「天氣判斷」 周末計劃郊游時&#xff0c;你是不是總會打開天氣預報反復確認&#xff1f;看到 "25℃、微風、無雨" 就興奮收拾行李&#xff0c;看到 "35℃、暴雨" 就果斷取消計劃。這個判斷過程&#xff0c;其…

HTTPS服務

HTTPS服務 一、常見的端口 http ------ 80 明文 https ------ 443 數據加密 dns ------ 53 ssh ------ 22 telent ------ 23 HTTPS http ssl或者tls &#xff08;安全模式&#xff09; 二、原理&#xff1a; c&#xff08;客戶端…