.NET8中使用JWT進行身份認(rèn)證和授權(quán)的實現(xiàn)
JSON Web Token(JWT)是一種非常流行的身份認(rèn)證和授權(quán)方式,廣泛應(yīng)用于 Web 應(yīng)用和微服務(wù)架構(gòu)中。它允許不同系統(tǒng)或服務(wù)之間安全地傳輸信息。JWT 具有無狀態(tài)的特性,能夠簡化認(rèn)證過程,并使得系統(tǒng)具備更好的擴展性。在 .NET 8 中,使用 JWT 進行身份認(rèn)證和授權(quán)變得更加簡便和高效。本篇文章將詳細(xì)介紹如何在 .NET 8 中使用 JWT。
一、什么是 JWT?
JWT(JSON Web Token)是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在不同方之間傳遞安全信息。它由三部分組成:
- Header(頭部):包含令牌的類型和簽名算法(如 HMAC SHA256 或 RSA)。
- Payload(載荷):包含聲明(Claims),聲明可以是關(guān)于實體的信息(如用戶)或其他數(shù)據(jù)。
- Signature(簽名):通過加密方式對 Header 和 Payload 進行簽名,以確保 JWT 的完整性,防止數(shù)據(jù)被篡改。
JWT 的格式通常是:
Header.Payload.Signature
其中,Header 和 Payload 是 Base64Url 編碼的字符串,而 Signature 是通過加密算法生成的數(shù)字簽名。
二、JWT 在 .NET 8 中的使用流程
1. 安裝所需 NuGet 包
首先,在 .NET 8 項目中,需要安裝兩個關(guān)鍵的 NuGet 包:
Microsoft.AspNetCore.Authentication.JwtBearer
:用于處理 JWT 認(rèn)證的中間件。System.IdentityModel.Tokens.Jwt
:用于生成和解析 JWT 令牌。
使用以下命令安裝:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt
2. 配置 JWT 認(rèn)證服務(wù)
在 .NET 8 中,配置 JWT 認(rèn)證服務(wù)的步驟已經(jīng)簡化,不再需要 Startup.cs
文件,所有配置都可以在 Program.cs
中完成。
打開 Program.cs
文件并添加如下配置:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; var builder = WebApplication.CreateBuilder(args); // 獲取 JWT 配置信息 var jwtSecretKey = builder.Configuration["Jwt:SecretKey"]; var jwtIssuer = builder.Configuration["Jwt:Issuer"]; var jwtAudience = builder.Configuration["Jwt:Audience"]; // 注冊 JWT 認(rèn)證服務(wù) builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = jwtIssuer, // 發(fā)行者 ValidAudience = jwtAudience, // 受眾 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey)), // 簽名密鑰 ValidateIssuer = true, // 驗證發(fā)行者 ValidateAudience = true, // 驗證受眾 ValidateLifetime = true, // 驗證過期時間 ClockSkew = TimeSpan.Zero // 設(shè)置允許的時間偏差,默認(rèn)是5分鐘 }; }); builder.Services.AddAuthorization(); builder.Services.AddControllers(); var app = builder.Build(); // 啟用認(rèn)證中間件 app.UseAuthentication(); // 啟用授權(quán)中間件 app.UseAuthorization(); // 配置路由 app.MapControllers(); app.Run();
配置解釋:
Jwt:SecretKey
、Jwt:Issuer
、Jwt:Audience
:從appsettings.json
配置文件中讀取密鑰、發(fā)行者和受眾。AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
:告訴應(yīng)用使用 JWT 認(rèn)證方式。TokenValidationParameters
:設(shè)置 JWT 的驗證規(guī)則,包括驗證發(fā)行者、受眾、簽名密鑰等。
3. 生成 JWT 令牌
生成 JWT 令牌通常發(fā)生在用戶登錄時,成功驗證用戶身份后,后端會生成并返回 JWT 令牌。在 .NET 8 中,我們可以通過以下方式生成 JWT 令牌:
using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; public class JwtTokenService { private readonly string _secretKey; private readonly string _issuer; private readonly string _audience; public JwtTokenService(IConfiguration configuration) { _secretKey = configuration["Jwt:SecretKey"]; _issuer = configuration["Jwt:Issuer"]; _audience = configuration["Jwt:Audience"]; } // 生成 JWT 令牌 public string GenerateToken(string username) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, username), // 用戶名 new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // JWT ID }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _issuer, // 發(fā)行者 audience: _audience, // 受眾 claims: claims, expires: DateTime.Now.AddHours(1), // 設(shè)置有效期為1小時 signingCredentials: creds // 簽名憑證 ); return new JwtSecurityTokenHandler().WriteToken(token); // 返回生成的JWT } }
生成 JWT 的步驟:
- 創(chuàng)建 Claims(聲明),例如用戶名和 JWT ID。
- 使用對稱密鑰(
SymmetricSecurityKey
)對 JWT 進行簽名。 - 設(shè)置有效期、發(fā)行者和受眾,并使用
JwtSecurityTokenHandler
來生成 JWT 令牌。
4. 保護 API 資源
一旦我們配置了 JWT 認(rèn)證,我們就可以在需要保護的 API 上使用 [Authorize]
特性。這意味著只有攜帶有效 JWT 的用戶才能訪問這些受保護的 API。
例如,下面是一個受保護的控制器:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; [Authorize] // 只有認(rèn)證通過的用戶才能訪問 [Route("api/[controller]")] [ApiController] public class SecureController : ControllerBase { [HttpGet] public IActionResult GetProtectedData() { return Ok(new { message = "This is a protected resource." }); } }
[Authorize] 特性:該特性用于標(biāo)記需要授權(quán)的 API。只有經(jīng)過身份驗證的用戶才能訪問這些資源。如果用戶未提供有效 JWT 或 JWT 已過期,系統(tǒng)將返回 401 Unauthorized
響應(yīng)。
5. 客戶端發(fā)送 JWT
客戶端需要將 JWT 添加到 HTTP 請求頭的 Authorization
字段中。請求格式如下:
Authorization: Bearer <your-jwt-token>
客戶端通常會在 localStorage
或 sessionStorage
中存儲 JWT,并在每次訪問受保護資源時通過請求頭發(fā)送 JWT。
6. 配置應(yīng)用設(shè)置
為了保持應(yīng)用的靈活性,JWT 密鑰、發(fā)行者和受眾等信息通常會存儲在 appsettings.json
文件中:
{ "Jwt": { "SecretKey": "your-256-bit-secret", "Issuer": "yourIssuer", "Audience": "yourAudience" } }
7. 刷新 JWT
JWT 通常具有較短的有效期(例如 1 小時),但為了提升用戶體驗,我們可以實現(xiàn)一個刷新令牌機制,允許用戶在 JWT 過期后通過刷新令牌獲取新的 JWT。
刷新令牌通常是長期有效的,直到用戶注銷或令牌被撤銷。實現(xiàn)刷新令牌的過程比較復(fù)雜,涉及到生成和驗證刷新令牌等邏輯,但它是許多現(xiàn)代 Web 應(yīng)用程序和 API 中常見的身份驗證模式。
三、總結(jié)
在 .NET 8 中,JWT 提供了一種高效且無狀態(tài)的方式來進行身份認(rèn)證和授權(quán)。通過 Program.cs
文件中的配置,我們可以輕松實現(xiàn) JWT 驗證、生成和保護 API 的功能。此外,JWT 的無狀態(tài)特性使得它在分布式系統(tǒng)和微服務(wù)架構(gòu)中非常有用。
整個 JWT 身份驗證的流程包括:
- 配置 JWT 認(rèn)證服務(wù)。
- 在用戶登錄時生成 JWT。
- 客戶端攜帶 JWT 請求受保護的 API。
- 后端驗證 JWT 的有效性并進行授權(quán)。
JWT 的使用使得系統(tǒng)更加輕量級,避免了服務(wù)器存儲會話信息,特別適用于現(xiàn)代 Web 應(yīng)用、SPA 和微服務(wù)架構(gòu)。
到此這篇關(guān)于.NET8中使用JWT進行身份認(rèn)證和授權(quán)的實現(xiàn)的文章就介紹到這了,更多相關(guān).NET8 JWT身份認(rèn)證和授權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis如何實現(xiàn)InsertOrUpdate功能
這篇文章主要介紹了Mybatis如何實現(xiàn)InsertOrUpdate功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05SpringMVC如何域?qū)ο蠊蚕頂?shù)據(jù)
在Spring MVC中,可以使用域?qū)ο髞砉蚕頂?shù)據(jù),域?qū)ο笫且粋€Map類型的對象,可以在請求處理方法之間共享數(shù)據(jù),本文給大家介紹SpringMVC 域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,一起看看吧2023-09-09Java實現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼
這篇文章主要介紹了Java實現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringBoot文件上傳控制及Java 獲取和判斷文件頭信息
這篇文章主要介紹了SpringBoot文件上傳控制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-12-12springboot如何接收get和post請求參數(shù)
這篇文章主要介紹了springboot如何接收get和post請求參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06