在ASP.NET Core中輕鬆使用JwtBeare進行身份驗證

来源:https://www.cnblogs.com/xbhp/archive/2023/05/15/17401507.html
-Advertisement-
Play Games

JwtBearer簡介 首先要搞清楚什麼是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份驗證提供程式。它提供了對JWT令牌進行驗證的功能,然後允許將令牌中包含的聲明(claims)用於用戶身份驗證和授權控制。 Json Web Toke ...


JwtBearer簡介

首先要搞清楚什麼是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份驗證提供程式。它提供了對JWT令牌進行驗證的功能,然後允許將令牌中包含的聲明(claims)用於用戶身份驗證和授權控制。

Json Web Token (JWT)是一種Web標準,用於在不同系統間傳輸數據。JWT是一種可驗證的和安全的方式,用於在各種應用程式之間傳遞信息。JWT具有一定的安全性,因為它是通過密鑰對JWT進行簽名的,以確保意味著不能進行篡改或偽造。

JWT由三個部分組成,分別為:“Header”、“Payload”和“Signature” 。其中,“header”表示JWT的元數據(元信息),用於描述加密信息和演算法;“payload”表示JWT的指令部分,用於承載用戶狀態或授權相關的信息;“signature”表示JWT的簽名信息,用於驗證JWT的有效性。

JwtBearer首先使用“header”中聲明的演算法對JWT進行身份驗證,以確保其未被篡改。然後,它將使用密鑰根據“payload”中的信息生成令牌,以在用戶請求中將其傳遞。

JwtBearer提供了配置選項,以允許您使用自定義的密鑰和演算法生成和驗證JWT令牌。它還允許您配置應用程式特定的聲明,以在用戶的身份驗證和授權管理中使用。

在.NET Core中使用

1)、首先新建一個APS.NET Core項目,然後在項目中添加JwtBearer包,可以用nuget包管理器添加,也可以使用nuget命令添加,命令如下:

dotnet add package  Microsoft.AspNetCore.Authentication.JwtBearer

2)新建一個JwtConfig類,用了存儲token相關數據。

public class JwtConfig
    {
        public string Key { get; set; } //key
        public int Expres { get; set; } //過期時間(單位秒)
        public string Issuer { get; set; }
        public string Audience { get; set; }
    }

3)、在appsettings.json中配置jwt密鑰

//配置文件appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  //JWT的配置內容
  "JWT": {//key必須有足夠的長度
      "Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12",
    "expres": "3",
     "Issuer": "https://localhost:7201",
    "Audience": "https://localhost:7201",
  }
}

4)在program.cs文件註入JwtBearer

//註入配置類
builder.Services.Configure<JwtConfig>(builder.Configuration.GetSection("JWT"));

5)新建一個類,專門創建token

//依賴註入
  private readonly IOptionsSnapshot<JwtConfig> jwtconfig;
  public Demo3Controller(IOptionsSnapshot<JwtConfig> jwtconfig)
  {
     this.jwtconfig = jwtconfig;
  }
public string CreateToken()
{
    // 創建聲明列表,即 Token 中攜帶的信息
    List<Claim> claims = new List<Claim>();
    claims.Add(new Claim(ClaimTypes.Name, "admin")); // 添加用戶名
    claims.Add(new Claim(ClaimTypes.NameIdentifier, "1080")); // 添加用戶 ID

    // 設置 Token 的過期時間
    DateTime expres = DateTime.Now.AddSeconds(jwtconfig.Value.Expres);
    Console.WriteLine($"過期時間{expres}");

    // 從配置文件中獲取 JWT 密鑰並轉換為位元組數組
    byte[] secbyse = Encoding.UTF8.GetBytes(jwtconfig.Value.Key);

    // 創建 SymmetricSecurityKey 對象並使用 HmacSha256 演算法對密鑰進行簽名
    var secKey = new SymmetricSecurityKey(secbyse);
    var credetials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256);

    // 創建 JwtSecurityToken 對象並設置聲明、過期時間和簽名信息
    var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expres, signingCredentials: credetials);

    // 生成 JWT Token 字元串並返回
    string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
    return jwt;
}

6)再在program.cs文件中驗證傳入的token,代碼如下:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
{
    var JwtOtp = builder.Configuration.GetSection("JWT").Get<JwtConfig>();
    byte[] keybase = Encoding.UTF8.GetBytes(JwtOtp.Key);
    var seckey = new SymmetricSecurityKey(keybase);
    opt.TokenValidationParameters = new()
    {
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = seckey,

    };
    opt.Events = new JwtBearerEvents
    {
        //許可權驗證失敗後執行
        OnChallenge = context =>
        {
            //終止預設的返回結果
            context.HandleResponse();
            string token = context.Request.Headers["Authorization"];
            var result = JsonConvert.SerializeObject(new { code = 401, message = "登錄過期" });
            if (string.IsNullOrEmpty(token))
            {
                result = JsonConvert.SerializeObject(new { code = 401, message = "token不能為空" });
                context.Response.ContentType = "application/json";
                //驗證失敗返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            try
            {
                JwtSecurityTokenHandler tokenheader = new();
                ClaimsPrincipal claimsPrincipal = tokenheader.ValidateToken(token, opt.TokenValidationParameters, out SecurityToken securityToken);
            }
            catch (SecurityTokenExpiredException)
            {
                result = JsonConvert.SerializeObject(new { code = 401, message = "登錄已過期" });
                context.Response.ContentType = "application/json";
                //驗證失敗返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                result = JsonConvert.SerializeObject(new { code = 402, message = "token令牌無效" });
                context.Response.ContentType = "application/json";
                //驗證失敗返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            context.Response.ContentType = "application/json";
            //驗證失敗返回401
            context.Response.StatusCode = StatusCodes.Status200OK;
            context.Response.WriteAsync(result);
            return Task.FromResult(result);
        }
    };
});
app.UseAuthentication();//.NETCore驗證中間件,必須有。並且在   app.UseAuthorization();之前

7)、在需要許可權的方法或控制器上加上特性[Authorize]

[HttpGet(Name = "GetAuthorize")]
 [Authorize]
public IEnumerable<WeatherForecast> Get()
{
    //doing
}

這樣就完成了JwtBearer驗證的代碼,具體調用見下文。

調用流程如下:

1)、首先獲得Token

可以通過登錄驗證後生成。如果是介面程式通過介面獲得。

效果如下:

2)、獲取Token後在請求頭添加Authorization驗證,並輸入獲得的Token,需要註意的是Token前面需要加Bearer並添加一個空格。

效果如下:

如果Token為空的效果:

註:在swagger加token需要另外在program.cs配置,代碼如下:

builder.Services.AddSwaggerGen(s =>
{
    //添加安全定義
    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "請輸入token,格式為 Bearer xxxxxxxx(註意中間必須有空格)",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    //添加安全要求
    s.AddSecurityRequirement(new OpenApiSecurityRequirement {
    {
        new OpenApiSecurityScheme{
            Reference =new OpenApiReference{
                Type = ReferenceType.SecurityScheme,
                Id ="Bearer"
            }
        },new string[]{ }
    }
});
});

添加好重啟程式後會在swagger的右上方增加如下按鈕,打開按鈕根據提示即可完成添加。

結語

本文介紹了ASP.NET Core如使用JwtBearer,以及JwtBearer生成token驗證的驗證過程。希望對你有所收穫,歡迎留言或吐槽。

來源公眾號:DotNet開發跳槽

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

-Advertisement-
Play Games
更多相關文章
  • 圖形驗證碼屬於老生常談了,具體細節這裡就不說了。生成圖形驗證碼的辦法非常多,今天講解一種通過Kaptcha組件快速生成圖形驗證碼的方法。Kaptcha是谷歌開源的一款簡單實用的圖形驗證碼組件。我個人推薦它的最大原因是容易上手,採用約定大於配置的方式,快速契合到項目中。話不多說,我們看看該如何使用它: ...
  • 本文介紹基於Python中whitebox模塊,對大量長時間序列柵格遙感影像的每一個像元進行忽略NoData值的多時序平均值求取~ ...
  • Lsof 備忘清單 lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網路連接和硬體。在終端下輸入lsof即可顯示系統打開的文件,因為 lsof 需要訪問核心記憶體和各種文件,所以必須以 ...
  • Lua 備忘清單 Lua 是一個小巧的腳本語言。它是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de F ...
  • PyCharm Professional 是一款針對 Python 編程的集成開發環境 (IDE),由 JetBrains 公司開發和維護。它是 PyCharm 社區版的升級版,提供了更多的功能和工具,旨在提高 Python 開發人員的生產力和效率。 以下是 PyCharm Professional ...
  • 本文屬於 OData 系列文章 引言 OData 是一個開放標準,已經在 oasis 組織標準化,因此我們可以在標準的官網查詢到 OData 的標準請求與返回形式:OData JSON Format Version 4.01 (oasis-open.org) 針對不同的數據類型,輸出返回的格式也不盡 ...
  • Blazor是一種使用.NET和C#構建客戶端Web應用程式的新興技術。它允許開發者在瀏覽器中直接運行.NET代碼,而無需依賴JavaScript。Blazor的技術優點主要表現在以下幾個方面: 單一語言棧:Blazor允許開發者使用C#和.NET進行全棧開發。一種語言用於前端和後端可以大大簡化開發 ...
  • 在VB.NET中,您可以使用Substring方法或Split方法來截取字元串。 Substring方法允許您從字元串中提取一個子字元串,該子字元串從指定的起始索引開始,並繼續到字元串的末尾或指定的長度。以下是使用Substring方法截取字元串的示例: Dim str As String = "H ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...