在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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...