ASP .NET Core 8結合JWT輕松實現身份驗證和授權

身份驗證和授權是每一個后端服務必不可少的,可以實現對非法請求進行攔截,能夠有效保護數據的安全性。

JSON Web Token(JWT)是一項開放標準(RFC 7519),它定義了一種緊湊且自包含的方法,用于以 JSON 對象的形式在各方之間安全地傳遞信息。這些信息經過數字簽名,因此可以被驗證和信任。

JWT官網文檔:JSON Web Token Introduction - jwt.io

一、配置身份驗證和授權

1、添加身份驗證和JWT授權庫

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerdotnet add package Microsoft.IdentityModel.Tokens

2、添加JWT配置信息到appsettings.json文件中

"JwtTokenConfig": {"Secret": "T#cx^Q$qsd8UrJMnY1(Vz$iie~lA3jgB96drYoPP4IDOffds&Qrw6GG+HClJteU#$)^JzMN_it#o*WE+*qVhE(_Ryy_t)","Issuer": "http://www.my.com/","Audience": "http://www.my.com/","AccessTokenExpiration": 240
}

3、創建JwtTokenConfig信息類

public class JwtTokenConfig
{public string Secret { get; set; } = string.Empty;public string Issuer { get; set; } = string.Empty;public string Audience { get; set; } = string.Empty;public int AccessTokenExpiration { get; set; }
}

4、啟用身份驗證和JWT授權服務

 var builder = WebApplication.CreateBuilder(args);JwtTokenConfig? jwtTokenConfig = builder.Configuration.GetSection("JwtTokenConfig").Get<JwtTokenConfig>();
if (jwtTokenConfig != null)
{builder.Services.AddSingleton(jwtTokenConfig);builder.Services.AddAuthentication(x =>{x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(x =>{x.RequireHttpsMetadata = true;x.SaveToken = true;x.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidIssuer = jwtTokenConfig.Issuer,ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtTokenConfig.Secret)),ValidAudience = jwtTokenConfig.Audience,ValidateAudience = true,ValidateLifetime = true,ClockSkew = TimeSpan.FromMinutes(1)};});
}var app = builder.Build();

5、顯示注冊身份驗證和授權

var app = builder.Build();app.UseCors();
app.UseAuthentication();
app.UseAuthorization();app.MapGet("/", () => "Hello World!");
app.Run();

注:身份驗證中間件是在 CORS 中間件運行后運行的,所以需要顯示注冊身份驗證和授權

6、在控制器基類中添加授權特性,對所有控制器施加授權驗證

[Route("api/[controller]/[action]")]
[ApiController]
[Authorize]
public abstract class BaseController : ControllerBase
{}

二、生成JWT授權碼

1、添加身份驗證和JWT授權庫

dotnet add package System.IdentityModel.Tokens.Jwtdotnet add package Microsoft.IdentityModel.Tokens

2、創建JWT授權服務接口


public interface IJwtAuthService
{string GenerateJwtToken(Claim[] claims);
}

3、創建JWT授權服務業務邏輯

public class JwtAuthService : IJwtAuthService
{private readonly JwtTokenConfig _jwtTokenConfig;public JwtAuthService(JwtTokenConfig jwtTokenConfig){_jwtTokenConfig = jwtTokenConfig;}public string GenerateJwtToken(Claim[] claims){bool shouldAddAudienceClaim = string.IsNullOrWhiteSpace(claims?.FirstOrDefault(x => x.Type == JwtRegisteredClaimNames.Aud)?.Value);JwtSecurityToken jwtToken = new(_jwtTokenConfig.Issuer,shouldAddAudienceClaim ? _jwtTokenConfig.Audience : string.Empty,claims,expires: DateTime.Now.AddMinutes(_jwtTokenConfig.AccessTokenExpiration),signingCredentials: new SigningCredentials(new SymmetricSecurityKey(_secret), SecurityAlgorithms.HmacSha256Signature));return new JwtSecurityTokenHandler().WriteToken(jwtToken);}
}

4、注冊JWT授權服務

var builder = WebApplication.CreateBuilder(args);builder.Services.AddSingleton<IJwtAuthService, JwtAuthService>();var app = builder.Build();

5、在授權控制器中使用JWT服務,生成Token


public class AuthController : BaseController
{private readonly IJwtAuthService _authService;public AuthController(IAuthService authService){_authService = authService;}[AllowAnonymous][HttpPost]public IActionResult Login([FromBody] LoginRequest request){// 1. 驗證用戶名密碼(偽代碼)if (!IsValidUser(request.User, request.Password))return Unauthorized();// 2. 創建JWT聲明(偽代碼)string roleName = "User";Claim[] claims =[new Claim(ClaimTypes.NameIdentifier, user),new Claim(ClaimTypes.Role, roleName)];// 3. 生成 JWT Tokenvar token = _authService.GenerateJwtToken(claims);// 4. 返回 Tokenreturn Ok(new { Token = token });}private bool IsValidUser(string user, string password){// 實際應該查數據庫(偽代碼)return user == "admin" && password == "123456";}
}

注:使用ClaimTypes.NameIdentifier來聲明用戶標識,可以在集成SignalR時使SignalR很容易獲取到用戶標識并進行消息發送,因為SignalR默認獲取的用戶標識就是ClaimTypes.NameIdentifier

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

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

相關文章

5G時代的智慧燈桿:塔能“一桿多用”方案如何激活城市新基建?

在《5G應用“揚帆”行動計劃》持續推進的進程之中&#xff0c;智慧桿已然成為了5G基站部署環節極為重要的載體&#xff0c;并且被明確地歸入到新型基礎設施建設的重點范疇之內。相關政策提出&#xff0c;要在2025年達成重點區域5G網絡全面且深度覆蓋的目標&#xff0c;與此同時…

護照閱讀器:國外證件識別的 OCR “解碼師”

國外證件版式多樣、語種繁雜&#xff0c;人工識別不僅耗時&#xff0c;還易因翻譯誤差、格式不熟悉導致信息錯漏。尤其在跨境業務場景中&#xff0c;傳統識別方式嚴重影響效率與準確性。護照閱讀器搭載的 OCR 技術成為破局關鍵。它能精準提取國外護照、駕照等證件上的多語種文字…

Linux部署Python服務

1、創建項目目錄與虛擬環境#確保安裝 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 創建虛擬環境#Linux source venv/bin/activate # 激活虛擬環境#Windowds venv\S…

【Python辦公】使用Python和Tkinter構建Excel數據導入MySQL工具(GUI版)

目錄 專欄導讀前言項目概述技術棧環境準備核心代碼實現1. 導入必要的庫2. 主應用類設計3. 用戶界面設計數據庫配置區域數據庫選擇區域4. 數據庫連接功能測試連接獲取數據庫列表5. 數據導入功能關鍵技術點解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 認證問題3. 避免啟動時連接錯…

華為OD機試_2025 B卷_猜數字(Python,100分)(附詳細解題思路)

題目描述 一個人設定一組四碼的數字作為謎底&#xff0c;另一方猜。 每猜一個數&#xff0c;出數者就要根據這個數字給出提示&#xff0c;提示以XAYB形式呈現&#xff0c;直到猜中位置。 其中X表示位置正確的數的個數&#xff08;數字正確且位置正確&#xff09;&#xff0c;而…

【網絡安全】理解安全事件的“三分法”流程:應對警報的第一道防線

1. 簡介 在網絡安全領域&#xff0c;每天都會產生大量安全警報。作為一名安全分析師&#xff0c;識別、評估并優先處理這些警報的能力至關重要。三分法&#xff08;Triage&#xff09; 是確保安全團隊高效響應安全事件的核心流程&#xff0c;它能夠幫助我們合理分配資源、集中精…

AI大模型計數能力的深度剖析:從理論缺陷到技術改進

AI大模型計數能力的深度剖析&#xff1a;從理論缺陷到技術改進 AI大模型在計數任務上表現出明顯的局限性&#xff0c;這不僅反映了模型架構的核心缺陷&#xff0c;也揭示了當前深度學習技術在處理結構化信息時的本質挑戰。通過對文本計數、圖像計數以及相關技術改進方向的全面分…

[C語言初階]結構體初階

目錄一、結構體的聲明二、結構體的定義和初始化三、結構體成員訪問四、結構體傳參五、函數調用的參數壓棧&#xff08;了解&#xff09;在C語言中&#xff0c;我們知道數組是一組相同類型元素的集合&#xff0c;而結構體則更為靈活&#xff0c;它允許我們將不同類型的數據組合在…

LVS(Linux Virtual Server)集群技術詳解

一.集群和分布式: 集群&#xff1a;同一個業務系統&#xff0c;部署在多臺服務器上&#xff0c;集群中&#xff0c;每一臺服務器實現的功能沒有差別&#xff0c;數據和代碼都是一樣的 分布式&#xff1a;一個業務被拆成多個子業務&#xff0c;或者本身就是不同的業務&#…

leetcode_27 移除元素

1. 題意 給定一個數組&#xff0c;把不等于val的元素全部移動到數組的前面來。 不需要考慮值為val里的元素。 2. 題解 2.1 同向雙指針 我們利用雙指針&#xff0c;慢指針指向下一個插入的位置。而快指針不斷向前找到首個不為val的值&#xff0c;找到后將快指針位置值賦給慢…

Linux-Ubuntu下的git安裝與配置

一、安裝git1.打開終端&#xff0c;運行以下命令&#xff08;需要聯網&#xff09;sudo apt-get update sudo apt-get install git2.驗證安裝安裝完成之后&#xff0c;通過運行以下命令驗證git是否已經正確安裝&#xff1a;git --version二、配置git2.1.配置用戶名及郵箱地址在…

2D和3D激光slam的點云去運動畸變

在使用激光雷達設備采集點云的時候&#xff0c;我們都知道&#xff0c;激光雷達是邊運動邊采集的&#xff0c;每一個點云采集時的激光雷達的中心和姿態都是不一樣的&#xff0c;如果不加以矯正&#xff0c;那么這一幀數據就會出現問題&#xff0c;比如采集一個平面的結構的時候…

Java 熱門面試題 200 道(Markdown表格版)【簡化版】

Java 熱門面試題 200 道(Markdown表格版)【簡化版】 Java與數據庫核心面試題摘要 本文精選200道Java與數據庫高頻面試題,重點涵蓋: Java集合: HashMap原理(數組+鏈表/紅黑樹)、ConcurrentHashMap分段鎖優化、紅黑樹改進目的(解決哈希沖突性能問題) MySQL索引: 最左前…

OpenCV探索之旅:多尺度視覺與形狀的靈魂--圖像金字塔與輪廓分析

在我們學會用Canny算法勾勒處世界的輪廓之后&#xff0c;一個更深層次的問題擺在了面前&#xff1a;這些由像素組成的線條&#xff0c;如何才能被賦予“生命”&#xff0c;成為我們能夠理解和分析的“形狀”&#xff1f;如果一個物體在圖像中時大時小&#xff0c;我們又該如何穩…

Redis作緩存時存在的問題及其解決方案

Redis最常用的一個場景就是作為緩存&#xff0c;本文主要探討Redis作為緩存&#xff0c;在實踐中可能會有哪些問題&#xff1f;比如一致性, 穿擊, 穿透, 雪崩, 污染等。 為什么要理解Redis緩存問題 在高并發的業務場景下&#xff0c;數據庫大多數情況都是用戶并發訪問最薄弱的…

day17 力扣654.最大二叉樹 力扣617.合并二叉樹 力扣700.二叉搜索樹中的搜索 力扣98.驗證二叉搜索樹

最大二叉樹給定一個不重復的整數數組 nums 。 最大二叉樹 可以用下面的算法從 nums 遞歸地構建:創建一個根節點&#xff0c;其值為 nums 中的最大值。遞歸地在最大值 左邊 的 子數組前綴上 構建左子樹。遞歸地在最大值 右邊 的 子數組后綴上 構建右子樹。返回 nums 構建的 最大…

天地圖前端實現geoJson與wkt格式互轉

geoJson與wkt都是WebGIS開發中經常用到的格式&#xff0c;天地圖行政區劃邊界接口返回的是wkt格式數據&#xff0c;需要轉換一下。 安裝插件&#xff1a;terraformer/wkt npm install terraformer/wkt 兩個函數&#xff1a; .wktToGeoJSON(WKT) ? object.geojsonToWKT(Geo…

(1-7-3)數據庫的基本查詢

目錄 1. 數據庫的基本查詢 1.1 簡單的記錄查詢 1.2 使用列別名 2. 數據分頁查詢 &#xff08;1&#xff09;查詢前五行數據 &#xff08;2&#xff09;查詢 11 ~ 15 行數據 3. 結果集排序 3.1 單關鍵字排序 &#xff08;1&#xff09;升序排列 &#xff08;2&#…

寶塔配置pgsql可以遠程訪問及pdo_pgsql擴展的安裝

本地navicat premium 17.0 可以遠程訪問pgsql v16.1寶塔的軟件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客戶端認證&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses關鍵字&#xff1b;第三步&#xff1a;在navicat里配…

SQL進階:自連接的用法

目錄 一、可重排列、排列、組合 1、創建表 2、錄入數據 3、獲取可重排列的商品名稱&#xff08;有序&#xff09; 4、獲取排列的商品名稱&#xff08;有序&#xff09; 5、獲取組合的商品名稱&#xff08;無序&#xff09; 6、獲取3個元素的組合商品名稱&#xff08;無序…