最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET8中使用JWT進(jìn)行身份認(rèn)證和授權(quán)的實現(xiàn)

 更新時間:2025年05月31日 09:24:26   作者:江沉晚呤時  
本文主要介紹了.NET8中使用JWT進(jìn)行身份認(rèn)證和授權(quán)的實現(xiàn),包括JWT組成、配置流程、令牌生成、API保護(hù)及刷新機(jī)制,具有一定的參考價值,感興趣的可以了解一下

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)具備更好的擴(kuò)展性。在 .NET 8 中,使用 JWT 進(jìn)行身份認(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 進(jìn)行簽名,以確保 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 進(jìn)行簽名。
  • 設(shè)置有效期、發(fā)行者和受眾,并使用 JwtSecurityTokenHandler 來生成 JWT 令牌。

4. 保護(hù) API 資源

一旦我們配置了 JWT 認(rèn)證,我們就可以在需要保護(hù)的 API 上使用 [Authorize] 特性。這意味著只有攜帶有效 JWT 的用戶才能訪問這些受保護(hù)的 API。

例如,下面是一個受保護(hù)的控制器:

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,并在每次訪問受保護(hù)資源時通過請求頭發(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)一個刷新令牌機(jī)制,允許用戶在 JWT 過期后通過刷新令牌獲取新的 JWT。

刷新令牌通常是長期有效的,直到用戶注銷或令牌被撤銷。實現(xiàn)刷新令牌的過程比較復(fù)雜,涉及到生成和驗證刷新令牌等邏輯,但它是許多現(xiàn)代 Web 應(yīng)用程序和 API 中常見的身份驗證模式。

三、總結(jié)

在 .NET 8 中,JWT 提供了一種高效且無狀態(tài)的方式來進(jìn)行身份認(rèn)證和授權(quán)。通過 Program.cs 文件中的配置,我們可以輕松實現(xiàn) JWT 驗證、生成和保護(hù) API 的功能。此外,JWT 的無狀態(tài)特性使得它在分布式系統(tǒng)和微服務(wù)架構(gòu)中非常有用。

整個 JWT 身份驗證的流程包括:

  • 配置 JWT 認(rèn)證服務(wù)。
  • 在用戶登錄時生成 JWT。
  • 客戶端攜帶 JWT 請求受保護(hù)的 API。
  • 后端驗證 JWT 的有效性并進(jìn)行授權(quán)。

JWT 的使用使得系統(tǒng)更加輕量級,避免了服務(wù)器存儲會話信息,特別適用于現(xiàn)代 Web 應(yīng)用、SPA 和微服務(wù)架構(gòu)。

到此這篇關(guān)于.NET8中使用JWT進(jìn)行身份認(rèn)證和授權(quán)的實現(xiàn)的文章就介紹到這了,更多相關(guān).NET8 JWT身份認(rèn)證和授權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SqlConnection.ConnectionString相關(guān)關(guān)鍵字

    SqlConnection.ConnectionString相關(guān)關(guān)鍵字

    SqlConnection.ConnectionString相關(guān)關(guān)鍵字...
    2007-01-01
  • .Net性能測試框架Crank的使用方法

    .Net性能測試框架Crank的使用方法

    這篇文章介紹了.Net性能測試框架Crank的使用方法。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • WPF圖表LiveChart使用詳解

    WPF圖表LiveChart使用詳解

    本文詳細(xì)講解了WPF圖表LiveChart的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET MVC把數(shù)據(jù)庫中枚舉項的數(shù)字轉(zhuǎn)換成文字

    ASP.NET MVC把數(shù)據(jù)庫中枚舉項的數(shù)字轉(zhuǎn)換成文字

    這篇文章介紹了ASP.NET MVC把數(shù)據(jù)庫中枚舉項的數(shù)字轉(zhuǎn)換成文字的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • ASP.NET Core開發(fā)Docker部署

    ASP.NET Core開發(fā)Docker部署

    這篇文章介紹了ASP.NET Core開發(fā)Docker部署的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • ASP.NET中 CheckBox復(fù)選框控件的使用

    ASP.NET中 CheckBox復(fù)選框控件的使用

    本文主要介紹ASP.NET中CheckBox復(fù)選框控件的使用,并舉例演示其用法,希望對大家有所幫助。
    2016-04-04
  • ASP.NET?MVC模式簡介

    ASP.NET?MVC模式簡介

    這篇文章介紹了ASP.NET?MVC模式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • 詳解ABP框架中的數(shù)據(jù)過濾器與數(shù)據(jù)傳輸對象的使用

    詳解ABP框架中的數(shù)據(jù)過濾器與數(shù)據(jù)傳輸對象的使用

    ABP框架是一個基于ASP.NET的Web開發(fā)框架,這里我們來詳解ABP框架中的數(shù)據(jù)過濾器與數(shù)據(jù)傳輸對象的使用,需要的朋友可以參考下
    2016-06-06
  • .NET?6更新使.NET生態(tài)系統(tǒng)蛻變

    .NET?6更新使.NET生態(tài)系統(tǒng)蛻變

    微軟正式發(fā)布.NET最新長期支持版本.NET?6,這個版本的更新重點(diǎn),除了C#和F#都有許多語言功能改進(jìn)之外,.NET?6終于集大成,成為跨瀏覽器、云計算、桌面、物聯(lián)網(wǎng)和移動應(yīng)用程序的統(tǒng)一平臺,性能也獲得大幅提升,并且更完整支持Arm64
    2022-01-01
  • .NET中的字符串駐留池介紹

    .NET中的字符串駐留池介紹

    這篇文章介紹了.NET中的字符串駐留池,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03

最新評論

宁陕县| 嫩江县| 睢宁县| 偃师市| 区。| 泰宁县| 于田县| 丰原市| 巫山县| 湟中县| 深泽县| 乌兰浩特市| 利川市| 天门市| 成武县| 贵州省| 辽宁省| 墨竹工卡县| 咸宁市| 红桥区| 临城县| 纳雍县| 织金县| 承德市| 敖汉旗| 津南区| 余庆县| 含山县| 华池县| 堆龙德庆县| 宜春市| 珲春市| 绿春县| 巩义市| 西乡县| 溧阳市| 尉犁县| 渭南市| 保山市| 亳州市| 右玉县|